এসকিউএলইটওপেনহেল্পার অনক্রিট () / অনআপগ্রেড () কখন চালিত হয়?


293

আমি আমার টেবিলগুলি আমার তৈরি করেছি SQLiteOpenHelper onCreate()তবে গ্রহণ করি

SQLiteException: no such table

অথবা

SQLiteException: no such column

ত্রুটি। কেন?

বিঃদ্রঃ:

(এটি প্রতি সপ্তাহে দশেক অনুরূপ প্রশ্নের সংমিশ্রিত সংক্ষিপ্তসার। এখানে একটি "আধ্যাত্মিক" সম্প্রদায় উইকির প্রশ্ন / উত্তর সরবরাহ করার চেষ্টা করা হচ্ছে যাতে এই সমস্ত প্রশ্ন একটি ভাল রেফারেন্সে পরিচালিত হতে পারে।)


12
@ এনডুপজা এটি আমার কোনও আসল সমস্যা নয়, কেবলমাত্র নবম বারের জন্য একই উত্তর / মন্তব্য লিখতে বিরক্ত।
লাল্টো

উত্তর:


352

SQLiteOpenHelper onCreate()এবং onUpgrade()callbacks প্রার্থনা যখন ডাটাবেসের আসলে একটি কল দ্বারা উদাহরণস্বরূপ, খোলা হয় getWritableDatabase()। যখন ডাটাবেস সহায়ক সহায়ক নিজে তৈরি করা হয় তখন ডাটাবেস খোলা হয় না।

SQLiteOpenHelperসংস্করণ ডাটাবেস ফাইল। সংস্করণ নম্বরটি কনস্ট্রাক্টরেরint কাছে আর্গুমেন্টটি দেওয়া হয় । ডাটাবেস ফাইলে, সংস্করণ নম্বরটি সংরক্ষণ করা হয় ।PRAGMA user_version

onCreate()কেবল তখনই চালানো হয় যখন ডাটাবেস ফাইলটি উপস্থিত ছিল না এবং সবে তৈরি হয়েছিল। যদি onCreate()সাফল্যের সাথে প্রত্যাবর্তন হয় (একটি ব্যতিক্রম ছুঁড়ে না), ডাটাবেসটি অনুরোধ করা সংস্করণ নম্বর দিয়ে তৈরি বলে ধরে নেওয়া হয়। অন্তর্নিহিত হিসাবে, আপনার নিজের SQLExceptionমধ্যে থাকা উচিত নয় onCreate()

onUpgrade()কেবল তখনই ডাকা হয় যখন ডাটাবেস ফাইল উপস্থিত থাকে তবে সঞ্চিত সংস্করণ নম্বরটি কনস্ট্রাক্টরের অনুরোধের চেয়ে কম থাকে। onUpgrade()অনুরোধ সংস্করণে টেবিল স্কিমা আপডেট করতে হবে।

কোডে টেবিল স্কিমা পরিবর্তন করার সময় (onCreate() ) ডাটাবেস আপডেট হয়েছে তা নিশ্চিত হওয়া উচিত। দুটি প্রধান পন্থা:

  1. পুরানো ডাটাবেস ফাইলটি মুছুন যাতে onCreate() আবার চালিত হয়। এটি প্রায়শই উন্নয়নের সময় পছন্দ হয় যেখানে ইনস্টল করা সংস্করণগুলির উপর আপনার নিয়ন্ত্রণ থাকে এবং ডেটা ক্ষতি কোনও সমস্যা নয়। ডাটাবেস ফাইল মুছে ফেলার কয়েকটি উপায়:

    • অ্যাপ্লিকেশন আনইনস্টল করুন। অ্যাপ্লিকেশন ম্যানেজার ব্যবহার করুন বাadb uninstall your.package.name শেল থেকে ।

    • অ্যাপ্লিকেশন ডেটা সাফ করুন। অ্যাপ্লিকেশন ম্যানেজার ব্যবহার করুন।

  2. ডাটাবেস সংস্করণ বৃদ্ধি করুন যাতে onUpgrade() করা হয়। এটি আরও কোড জটিল হওয়ার কারণে এটি আরও জটিল।

    • বিকাশের সময়ের স্কিমা আপগ্রেডের জন্য যেখানে ডেটা হ্রাস কোনও সমস্যা নয়, আপনি কেবল এটি ব্যবহার করতে পারেন execSQL("DROP TABLE IF EXISTS <tablename>") বিদ্যমান বিদ্যমান সারণীগুলি সরাতে এবং onCreate()ডাটাবেসটি পুনরায় তৈরি করতে কল করতে পারেন।

    • প্রকাশিত সংস্করণগুলির জন্য আপনার ডেটা মাইগ্রেশন প্রয়োগ করা উচিত onUpgrade()যাতে আপনার ব্যবহারকারীরা তাদের ডেটা হারাবেন না।


2
@ লাওল্টো // অন-আপগ্রেডে ডেটা মাইগ্রেশন () // আপনি দয়া করে এটি সম্পর্কে ব্যাখ্যা করতে পারেন।
বিলি্লিকস

2
@ বালা এই প্রশ্ন / উত্তরের সুযোগে নেই। আপনার যদি প্রশ্ন থাকে তবে নির্দ্বিধায় এটিকে প্রশ্ন হিসাবে পোস্ট করুন।
লাল্টো

2
@ জাসকি সংস্করণ নম্বরটি আপনার কোডের জন্য যা কোডটি স্কিমা সংস্করণটির বিরুদ্ধে চালানো আশা করে। যদি ফাইলটি পুরানো হয় (আপনার অ্যাপ্লিকেশনটির পূর্ববর্তী সংস্করণ থেকে) তবে এটি আপগ্রেড করা দরকার।
লাল্টো

4
সুতরাং, এসকিউএলহেল্পারে প্রতিবার স্কিমাটি সংশোধন করার জন্য আমাকে হার্ড কোডিং করতে হবে, যাতে পুরানো অ্যাপটি যখন চলে এবং ডিবি সংযোগ পেয়ে এটি পুরানো হয় এবং তারপরে অন-আপগ্রেডটি অনক্রিটের পরিবর্তে ট্রিজিগারড হয়ে যায়, এটি কি ঠিক আছে?
জেসকি

2
ধন্যবাদ ! এটি আমার কাছে বোধগম্য। দয়া করে যাচাই করুন যদি আমি ভালভাবে বুঝতে পারি। সুতরাং আমাদের 1 টি করা দরকার every প্রতিবার আমরা স্কিমা আপডেট করার সাথে সাথে DB_VERSION ভেরিয়েবল (হার্ড কোড) সংশোধন করুন। ২. ইন onUpdate(), প্রতিটি পুরানো সংস্করণ পরীক্ষা করুন এবং সঠিক ডেটা মাইগ্রেশন করুন। এবং তারপরে কোনও ব্যবহারকারী তাদের অ্যাপ আপডেট করার সময় (তাদের পুরানো ডিবি ফাইল রয়েছে) onUpgradeট্রিগ্রেড হবে এবং ব্যবহারকারী যদি নতুন ইনস্টল onCreate()হয় তবে ট্রিগার করা হবে is
জেসকি 11

97

আরও এখানে অনুপস্থিত পয়েন্ট যুক্ত করতে, জস্কির অনুরোধ অনুসারে

ডাটাবেস সংস্করণ SQLiteডাটাবেস ফাইলের মধ্যে সংরক্ষণ করা হয় ।

ক্যাচটি কনস্ট্রাক্টর

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

সুতরাং যখন ডেটাবেস হেল্পার কনস্ট্রাক্টর সাথে ডাকা হয় name (২ য় প্যারাম) , প্ল্যাটফর্মটি পরীক্ষা করে যে ডেটাবেস উপস্থিত রয়েছে কি না এবং যদি ডাটাবেস উপস্থিত থাকে, এটি ডাটাবেস ফাইল শিরোলেখ থেকে সংস্করণ তথ্য পায় এবং ডান কলটি আবার ট্রিগার করে

পুরানো উত্তরে যেমন ইতিমধ্যে ব্যাখ্যা করা হয়েছে, নামের সাথে থাকা ডাটাবেসটি উপস্থিত না থাকলে এটি ট্রিগার করে onCreate

নীচে ব্যাখ্যা ব্যাখ্যা onUpgrade একটি উদাহরণ দিয়ে কেস ।

বলুন, আপনার অ্যাপ্লিকেশনটির প্রথম সংস্করণটি কনস্ট্রাক্টর পাসিং সংস্করণ হিসাবে DatabaseHelper(বর্ধিত SQLiteOpenHelper) ছিল 1এবং তারপরে আপনি নতুন উত্স কোড হিসাবে সংস্করণটি পাস করার সাথে সাথে একটি আপগ্রেড অ্যাপ্লিকেশন সরবরাহ করেছিলেন 2, তারপরে স্বয়ংক্রিয়ভাবে DatabaseHelperনির্মিত হয়, প্ল্যাটফর্মটি ট্রিগার হয়ে যায়onUpgrade ফাইলটি ইতিমধ্যে উপস্থিত দেখে করে, তবে আপনি যে সংস্করণটি পেরিয়ে গেছেন তার তুলনায় সংস্করণটি কম।

এখন বলুন আপনি ডিবি সংস্করণ সহ অ্যাপ্লিকেশনটির তৃতীয় সংস্করণ দেওয়ার পরিকল্পনা করছেন 3(ডিবি সংস্করণটি কেবল তখনই বাড়ানো হবে যখন ডাটাবেস স্কিমাটি পরিবর্তন করতে হবে)। এই জাতীয় বর্ধিত আপগ্রেডগুলিতে আপনাকে আরও ভাল রক্ষণাবেক্ষণযোগ্য কোডের জন্য প্রতিটি সংস্করণ থেকে ক্রমবর্ধমান আপগ্রেড যুক্তি লিখতে হবে

নীচে সিউডো কোড উদাহরণ:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  switch(oldVersion) {
    case 1:
       //upgrade logic from version 1 to 2
    case 2:
       //upgrade logic from version 2 to 3
    case 3:
       //upgrade logic from version 3 to 4
       break;
    default:
       throw new IllegalStateException(
                "onUpgrade() with unknown oldVersion " + oldVersion);
  }
}

breakক্ষেত্রে অনুপস্থিত বিবৃতি লক্ষ্য করুন 1এবং 2। এটি আমি ইনক্রিমেন্টাল আপগ্রেড বলতে চাইছি।

যদি পুরাতন সংস্করণ বলুন 2এবং নতুন সংস্করণ 4, তারপর যুক্তিবিজ্ঞান থেকে ডাটাবেসের আপগ্রেড করবে 2করার 3এবং তারপর4

পুরোনো সংস্করণ হয়, তাহলে 3করুন এবং নতুন সংস্করণ 4, এটা ঠিক জন্য আপগ্রেড যুক্তিবিজ্ঞান চালানো হবে 3থেকে4


1
আমি মনে করি আপনি পরিবর্তে আপনার সুইচ (নিউ ভার্সন) স্যুইচ (ওল্ড ভার্সন) হতে চান। আপনি এটিও যাচাই করতে চাইতে পারেন যে নিউ ভার্সনটি 4 (এবং 5, বা 3 নয়; কারণ আপনার যুক্তিটি ধরে নিচ্ছে যে নতুন সংস্করণটি 4 হওয়া উচিত) এটি যেমন পুরানো সংস্করণ 2 এবং নতুন সংস্করণ 5 হয় তবে আপনি কেস 4 টি আঘাত করুন: এবং 3 থেকে 4 থেকে আপগ্রেড করুন (যা সম্ভবত আচরণের প্রত্যাশিত হওয়া উচিত নয়)।
জো পি

ঠিক আছে - টাইপো .. কিন্তু যদি নতুন সংস্করণ 5 -> তারপর, এটা সবসময় IllegalStateException নিক্ষেপ করা হবে এবং বিকাশকারী .. ক্ষেত্রে 5 যোগ করে এটি ঠিক করা হবে না
Aun

1
যদি ব্যবহারকারী কেবল তার অ্যাপ্লিকেশনটিকে 2 থেকে 3 সংস্করণে আপগ্রেড করে? সেক্ষেত্রে, মামলা 4 অবধি সমস্ত মামলা চলবে।
পরমবীর সিং

6
@ পরিমাপ ব্যবহারকারীরা এটি করতে পারবেন না। তিনি কেবলমাত্র সর্বশেষে (এখানে 4) 2 এ আপগ্রেড করতে পারেন।
হবিব পারওয়াদ

20

onCreate()

  1. যখন আমরা প্রথমবার ডেটাবেস তৈরি করি (যেমন ডেটাবেস উপস্থিত নেই) onCreate()সেই সংস্করণ সহ ডাটাবেস তৈরি করে যা পাস করা হয় SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

  2. onCreate()পদ্ধতিটি আপনি যে সারণিগুলি সংজ্ঞায়িত করেছেন এবং আপনার লিখিত অন্য কোনও কোডটি কার্যকর করছে exec তবে এই পদ্ধতিটি কেবল তখনই কল করা হবে যদি আপনার অ্যাপ্লিকেশনটির ডেটা ডিরেক্টরিতে ( /data/data/your.apps.classpath/databases) এসকিউএলাইট ফাইল অনুপস্থিত থাকে ।

  3. আপনি যদি আপনার কোড পরিবর্তন করেন এবং এমুলেটরটিতে পুনরায় চালু করেন তবে এই পদ্ধতিটি বলা হবে না। আপনি যদি onCreate()চালাতে চান আপনার এসকিউএল ডাটাবেস ফাইলটি মুছতে অ্যাডবি ব্যবহার করতে হবে।

onUpgrade()

  1. SQLiteOpenHelper সুপার কনস্ট্রাক্টর কল করা উচিত।
  2. onUpgrade()যখন সংস্করণ পূর্ণসংখ্যা অ্যাপ্লিকেশন চলমান বর্তমান সংস্করণ চেয়ে বড় পদ্ধতিটি কেবল ডাকা হবে।
  3. আপনি যদি onUpgrade()পদ্ধতিটি কল করতে চান তবে আপনার কোডটিতে সংস্করণ নম্বরটি বাড়ানো দরকার।

1
আপনি যে উত্তরটি সরবরাহ করেন সে সম্পর্কে আরও কিছু বিবরণ যুক্ত করে আরও উত্তর দিতে পারেন?
অ্যারিসোন

10

আমি হতে দেরী হতে পারে তবে আমি আমার সংক্ষিপ্ত এবং মিষ্টি উত্তরটি ভাগ করতে চাই। একই সমস্যার জন্য দয়া করে উত্তর পরীক্ষা করুন । এটা নিশ্চিত ভাবে আপনাকে সাহায্য করবে। আরও গভীর স্পেসিফিকেশন নেই।

আপনি যদি টেবিল তৈরির জন্য সিনট্যাক্স সম্পর্কে আত্মবিশ্বাসী হন, তার চেয়ে বেশি আপনি যখন একই টেবিলে নতুন কলাম যুক্ত করবেন তখন এর জন্য ...

1) আপনার ডিভাইসটি আনইনস্টল করুন এবং এটি আবার চালান।

অথবা

2) সেটিং -> অ্যাপ -> ক্লিয়ারডেটা

অথবা

3)DATABASE_VERSION আপনার "ডেটাবেসহ্যান্ডলার" শ্রেণিতে পরিবর্তন (আপনি যদি নতুন কলামটি যুক্ত করেন তবে এটি স্বয়ংক্রিয়ভাবে আপগ্রেড হবে)

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

অথবা

৪)DATABASE_NAME আপনার "ডাটাবেসহ্যান্ডলার" শ্রেণিতে পরিবর্তন (আমি একই সমস্যার মুখোমুখি হয়েছি But তবে আমি পরিবর্তন করে সফল হই DATABASE_NAME))


আমার নিজস্ব ডিবি রয়েছে এবং এসকিউএলএইসেটহেল্পার ক্লাস ব্যবহার করা হচ্ছে। সুতরাং, আমি এর আগে স্কিল স্ক্রিপ্ট দ্বারা ডিবি তৈরি করেছিলাম এবং ডিবি তৈরি হয়েছিল। এসকিউএলএটিসেটহেল্পার ব্যবহার করে এটি এমুলেটর বা ডিভাইসটি অ্যাপটি আনইনস্টল না করা পর্যন্ত ডিবি অনুলিপি করতে পারেনি, কারণ এটি একই সংস্করণ সহ একটি ডিবি ছিল।
বেহজাদ

4

প্রসারিত করার সময় মনে রাখার পয়েন্টগুলি SQLiteOpenHelper

  1. super(context, DBName, null, DBversion); - এটি নির্মাণকারীর প্রথম লাইন করা উচিত
  2. ওভাররাইড onCreateএবং onUpgrade(যদি প্রয়োজন হয়)
  3. onCreateকেবলমাত্র কার্যকর করা হলে getWritableDatabase()বা getReadableDatabase()কার্যকর করা হবে। এবং এটি কেবল তখনই অনুরোধ করা হবে যখন DBNameপ্রথম ধাপে একটি নির্দিষ্ট উপলব্ধ থাকে না। আপনি onCreateপদ্ধতিতে সারণী ক্যোয়ারী তৈরি করতে পারেন
  4. আপনি যখনই নতুন টেবিল যুক্ত করতে চান কেবল পরিবর্তন করুন DBversionএবং onUpgradeসারণীতে প্রশ্নগুলি করুন বা কেবল আনইনস্টল করুন তারপরে অ্যাপটি ইনস্টল করুন।

3

টেবিল তৈরি করার প্রয়োজন হলে প্রথমবার অনক্রেটকে ডাকা হয়। আমাদের এই পদ্ধতিটি ওভাররাইড করতে হবে যেখানে আমরা টেবিল তৈরির জন্য স্ক্রিপ্ট লিখি যা এসকিউএলডিটিবেস দ্বারা কার্যকর করা হয়। execSQL পদ্ধতি method প্রথমবারের মোতায়েনের সময় কার্যকর করার পরে এই পদ্ধতিটি আর বলা হবে না।

অনআপগ্রেড ডাটাবেস সংস্করণ আপগ্রেড করার সময় এই পদ্ধতিটি বলা হয়। ধরা যাক প্রথমবারের জন্য মোতায়েনের জন্য, ডাটাবেস সংস্করণটি 1 এবং দ্বিতীয় স্থাপনায় টেবিলে অতিরিক্ত কলাম যুক্ত করার মতো ডাটাবেস কাঠামোর পরিবর্তন ছিল। ধরুন, এখন ডাটাবেস সংস্করণ 2।


2

আপনি ডাটাবেস এবং টেবিলের মতো তৈরি করতে পারেন

public class DbHelper extends SQLiteOpenHelper {
private static final String DBNAME = "testdatbase.db";
private static final int VERSION = 1;

public DbHelper(Context context) {
    super(context, DBNAME, null, VERSION);
    // TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("create table BookDb(id integer primary key autoincrement,BookName text,Author text,IssuedOn text,DueDate text,Fine text,Totalfine text");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS BookDb");
    onCreate(db);
  }
}

দ্রষ্টব্য: আপনি যদি অন্য কোনও টেবিল তৈরি করতে চান বা কলামগুলি বা এই জাতীয় কোনও টেবিল যুক্ত করতে না চান তবে কেবল ভার্সন বৃদ্ধি করুন


2

স্ক্লাইট ডাটাবেস দুটি পদ্ধতির ওভাররাইড করে

1) অনক্রিয়েট (): অ্যাপ্লিকেশন প্রথমবার শুরু করা হলে এই পদ্ধতিটি কেবল একবারই ডাকা হয়। সুতরাং এটি শুধুমাত্র একবার বলা হয়

২) অনগ্রেড () আমরা যখন ডাটাবেস সংস্করণটি পরিবর্তন করি তখন এই পদ্ধতিটি ডাকা হয়, তখন এই পদ্ধতিগুলি ডাকে।


1

এই জাতীয় কোনও টেবিল পাওয়া যায় না যখন আপনি SQLiteOpenHelperক্লাসটি না খোলেন getwritabledata()এবং এর আগে আপনাকে ডাটাবেসনাম এবং সংস্করণ সহ মেক কন্সট্রাক্টরকেও কল করতে হবে। এবং OnUpgradeযখনই দেওয়া সংস্করণ সংখ্যায় আপগ্রেড মান থাকে তখনই তাকে বলা হয়SQLiteOpenHelper ক্লাসে ।

নীচে কোড স্নিপেট (কলামের নামে বানানের কারণে এরকম কোনও কলাম পাওয়া যায় নি):

public class database_db {
    entry_data endb;
    String file_name="Record.db";
    SQLiteDatabase sq;
    public database_db(Context c)
    {
        endb=new entry_data(c, file_name, null, 8);
    }
    public database_db open()
    {
        sq=endb.getWritableDatabase();
        return this;
    }
    public Cursor getdata(String table)
    {
        return sq.query(table, null, null, null, null, null, null);
    }
    public long insert_data(String table,ContentValues value)
    {
        return sq.insert(table, null, value);
    }
    public void close()
    {
        sq.close();
    }
    public void delete(String table)
    {
        sq.delete(table,null,null);
    }
}
class entry_data extends SQLiteOpenHelper
{

    public entry_data(Context context, String name, SQLiteDatabase.CursorFactory factory,
                      int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase sqdb) {
        // TODO Auto-generated method stub

        sqdb.execSQL("CREATE TABLE IF NOT EXISTS 'YOUR_TABLE_NAME'(Column_1 text not null,Column_2 text not null);");

    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          onCreate(db);
    }

}

1

আপনি যদি কনস্ট্রাক্টরকে দ্বিতীয় যুক্তি হিসাবে "নাম" স্ট্রিং সরবরাহ করতে ভুলে যান তবে এটি একটি "ইন-মেমরি" ডাটাবেস তৈরি করে যা আপনি অ্যাপটি বন্ধ করে দিলে মুছে যায়।


0

এমুলেটর বা ডিভাইস থেকে আপনার অ্যাপ্লিকেশন আনইনস্টল করুন। অ্যাপটি আবার চালান। (ডাটাক্রিয়া ইতিমধ্যে উপস্থিত থাকলে অনক্রিয়েট () কার্যকর করা হয় না)


0

আপনার ডাটাবেসের নাম অবশ্যই .db এর সাথে শেষ হওয়া উচিত আপনার কোয়েরির স্ট্রিংগুলির অবশ্যই একটি টার্মিনেটর (;) থাকতে হবে


0

আপনার ডাটাবেসহ্যান্ডলার / ডাটাবেস ম্যানেজার ক্লাসে আপনার কোয়েরিটি পুনরায় পরীক্ষা করুন (যা আপনি কখনও নিয়েছেন)


0

আমার ক্ষেত্রে আমি এক্সএমএল-ফাইল থেকে আইটেমগুলি <string-array>পাই, যেখানে আমি স্টোর করি <item>। এই <item>গুলিগুলিতে আমি এসকিউএল স্ট্রিংগুলি ধারণ করি এবং এর সাথে একের পর এক প্রয়োগ করি databaseBuilder.addMigrations(migration)। আমি একটি ভুল করেছি, \উদ্ধৃতি দেওয়ার আগে যোগ করতে ভুলে গিয়েছিলাম এবং ব্যতিক্রম পেয়েছি:

android.datedia.sqlite.SQLiteException: এরকম কোনও কলাম নেই: some_value (কোড 1 SQLITE_ERROR):, সংকলন করার সময়: সারণীর নাম (আইডি, নাম) VALUES (1, কিছু_মূল্য) অন্তর্ভুক্ত করুন

সুতরাং, এটি একটি সঠিক বৈকল্পিক:

<item>
    INSERT INTO table_name(id, name) VALUES(1, \"some_value\")
</item>

-2

স্ক্লাইটোপেনহেল্পারের পদ্ধতিতে পদ্ধতি তৈরি এবং আপগ্রেড থাকে, যখন কোনও টেবিল প্রথমবার তৈরি করা হয় তখন তৈরি ব্যবহার করা হয় এবং যখনই সারণীর সংখ্যাটি পরিবর্তন করা হয় তখনই আপগ্রেড পদ্ধতিটি কল করা হবে।


ডাটাবেস সংস্করণ বৃদ্ধি পেলে কলামের সংখ্যা পরিবর্তিত হয় না, তবে অপগ্রেড পদ্ধতিটি ডাকা হয়। সূত্র: developer.android.com/reference/android/database/sqlite/... , int- int- এ)
রজার হুয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.