गेबे सेचन की टिप्पणी के अनुसार, सबसे आसान तरीका यह होगा कि हर बार ऐप शुरू होने पर डीबी को एसेट फोल्डर से कॉपी किया जाए, जो कि बदलना है:-
private void createDB(){
boolean dbExist = DBExists();
if(!dbExist){
this.getReadableDatabase();
copyDBFromResource();
}
dbSglite=getReadableDatabase();
}
करने के लिए :-
private void createDB(){
copyDBFromResource();
dbSglite=getReadableDatabase();
}
आपको स्पष्ट रूप से टिप्पणी करने में चिंता है
<ब्लॉककोट>"क्या वह हर बार गतिविधि शुरू होने पर DB की नकल नहीं करेगा।"
हां यह होगा (क्या यह इतना बुरा होगा? - बयानबाजी )
हालाँकि, मान लें कि आप डेटाबेस संस्करण का उपयोग कर रहे थे यानी वर्तमान संस्करण के विरुद्ध संपत्ति फ़ोल्डर में संस्करण की जाँच करें। आपको अभी भी मूल रूप से संपत्ति फ़ोल्डर से डेटाबेस तक पहुंचने की आवश्यकता है, इसलिए आप एक डेटाबेस को दूसरे के खिलाफ जांच रहे होंगे (कम से कम उन्हें खोलना)। तो अभी भी कुछ अतिरिक्त खर्च होंगे।
एक विकल्प जो कम गहन हो सकता है, वह है संपत्ति फ़ाइल की पिछली बार संशोधित . की जांच करना साझा प्राथमिकताओं में अंतिम कॉपी की गई संपत्ति फ़ाइल की तिथि के विरुद्ध दिनांक। (File
lastModified
विधि) फ़ाइल - अंतिम संशोधित।
एक अन्य विकल्प, इसी तरह के दृश्य में, पैकेज की जांच करना होगा संस्करण अंतिम क्रियान्वित के खिलाफ, साझा प्राथमिकताओं में फिर से संग्रहीत। पैकेजइन्फो - वर्जनकोड।
बेशक इन दोनों विकल्पों में, डेटाबेस को एसेट फ़ाइल से बदलना केवल तभी हो रहा है जब कोई अंतर (वृद्धि) हो।
पैकेज संस्करण का उपयोग करने का उदाहरण
निम्न उदाहरण (dbHelper . के अंतर्गत सभी परिवर्तन) वर्ग) यदि पैकेज संस्करण बढ़ा दिया गया है (या यदि डेटाबेस मौजूद नहीं है) तो डेटाबेस को संपत्ति से कॉपी करेगा:-
class dbHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "questions.db";
private static final int SCHEMA_VERSION = 1;
private static final String SHARED_PREFS = "shared_prefs";
private static final String SHARED_PREFKEY_QUESTIONSDBLASTUPDATED = "spkey_qdblastupdated";
public SQLiteDatabase dbSglite;
private String mDBPath;
private final Context myContext;
public dbHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
this.myContext=context;
this.mDBPath=context.getDatabasePath(DATABASE_NAME).getParent();
}
@Override
public void onCreate(SQLiteDatabase db){
Log.d("ONCREATE","OnCreate Method Called.");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDatabase(){
createDB();
}
private void createDB(){
if (isQuestionsDBNew() || (!DBExists())) {
Log.d("COPYFROMASSET", "Copying Questions From Assets");
copyDBFromResource();
setQuestionsDBNew(getPackageVersion());
} else {
Log.d("COPYFROMASSET",
"Questions not copied from Assets - New Questions Check result was " +
Boolean.toString(isQuestionsDBNew()) +
" DB Exists result was " + Boolean.toString(DBExists())
);
}
dbSglite=getReadableDatabase();
}
private boolean DBExists(){
SQLiteDatabase db = null;
try {
String databasePath = myContext.getDatabasePath(DATABASE_NAME).getPath();
db = SQLiteDatabase.openDatabase(databasePath,null, SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
} catch (SQLiteException e) {
Log.e("SqlHelper", "database not found");
}
if (db != null) {
db.close();
}
return db != null;
}
private void copyDBFromResource() {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = myContext.getAssets().open(DATABASE_NAME);
File databasedir = new File(myContext.getDatabasePath(DATABASE_NAME).getParent());
databasedir.mkdirs();
outputStream = new FileOutputStream(mDBPath+"/"+DATABASE_NAME);
byte[] buffer = new byte[1024];
int length;
while ((length=inputStream.read(buffer))>0){
outputStream.write(buffer, 0, length);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
throw new Error("Problem copying database.");
}
}
public void openDataBase() throws SQLException {
String myPath = myContext.getDatabasePath(DATABASE_NAME).getPath();
dbSglite = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
private boolean isQuestionsDBNew() {
SharedPreferences prefs = myContext.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE);
long stored_lastused = prefs.getLong(SHARED_PREFKEY_QUESTIONSDBLASTUPDATED,-1);
Log.d("NEWQUESTIONS?", "Result of testing package version " +
String.valueOf(stored_lastused) +
" against " +
String.valueOf( getPackageVersion()) +
" was " + String.valueOf(stored_lastused < getPackageVersion()));
return (stored_lastused < getPackageVersion());
}
private long getPackageVersion() {
PackageInfo pi;
try {
pi = myContext.getPackageManager().getPackageInfo(myContext.getPackageName(),0);
} catch (PackageManager.NameNotFoundException e) {
return -1;
}
Log.d("PACKAGEVERSION", "The version of package " +
myContext.getPackageName() +
" was " +
String.valueOf(pi.versionCode)
);
return pi.versionCode;
}
private void setQuestionsDBNew(long lastused) {
SharedPreferences.Editor editor = myContext.getSharedPreferences(SHARED_PREFS, Context.MODE_PRIVATE).edit();
editor.putLong(SHARED_PREFKEY_QUESTIONSDBLASTUPDATED,lastused);
editor.apply();
}
}
नोट
- कोड काफी हद तक प्रश्न के कोड पर आधारित है। ये हैं :-
- साझा वरीयता प्रबंधन के लिए दो अतिरिक्त वर्ग चर (स्थिरांक)।
- तीन नए तरीके:-
isQuestionsDBNew
यदि पैकेज संस्करण साझा प्राथमिकताओं में संस्करण स्टोर से बड़ा है (साझा प्राथमिकताओं में कुछ भी परिणाम -1 नहीं है, तो किसी भी पैकेज संस्करण से कम होना चाहिए)।getPackageVersion
पैकेज संस्करण को लंबे समय तक लौटाता है।setQuestionsDBNew
जो लागू साझा वरीयता को अद्यतन करता है।- पैकेज संस्करण परिवर्तन की जांच करने के लिए createDB में परिवर्तन और फिर संपत्ति से डेटाबेस की प्रतिलिपि बनाएँ। यह देखने के लिए एक अतिरिक्त जाँच है कि क्या डेटाबेस मौजूद है, हालाँकि इसकी आवश्यकता केवल तभी होगी जब डेटाबेस फ़ाइल को हटा दिया गया हो। ऐप के डेटा को हटाने से साझा प्राथमिकताएं हट जाएंगी, जिसके परिणामस्वरूप डेटाबेस कॉपी हो जाएगा।
- कोड में कुछ नैदानिक लॉगिंग शामिल हैं जिन्हें मैंने छोड़ दिया है।
- इसका व्यापक परीक्षण नहीं किया गया है (यानी मैं पैकेज संस्करण को बढ़ाने की हद तक नहीं गया हूं)।
उदाहरण से आउटपुट - ऐप इंस्टॉल किया जा रहा है:-
01-05 19:46:44.849 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/NEWQUESTIONS?: Result of testing package version -1 against 1 was true
01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:46:44.850 26692-26692/m.com.so48103235_updateprepopdb D/COPYFROMASSET: Copying Questions From Assets
01-05 19:46:44.855 26692-26692/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
उदाहरण से आउटपुट - बाद के रन:-
01-05 19:48:10.375 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:48:10.376 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:48:10.376 26755-26755/m.com.so48103235_updateprepopdb D/NEWQUESTIONS?: Result of testing package version 1 against 1 was false
01-05 19:48:10.376 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:48:10.381 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:48:10.381 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:48:10.381 26755-26755/m.com.so48103235_updateprepopdb D/NEWQUESTIONS?: Result of testing package version 1 against 1 was false
01-05 19:48:10.382 26755-26755/m.com.so48103235_updateprepopdb D/PACKAGEVERSION: The version of package m.com.so48103235_updateprepopdb was 1
01-05 19:48:10.387 26755-26755/m.com.so48103235_updateprepopdb D/COPYFROMASSET: Questions not copied from Assets - New Questions Check result was false DB Exists result was true
- अतिरिक्त संदेशों के कारण अधिक व्यापक संदेश का उपयोग यह रिपोर्ट करते समय किया जाता है कि डेटाबेस को फिर से कॉल करने के तरीकों की प्रतिलिपि नहीं बनाई गई थी जो लॉग संदेश जोड़ते हैं।