2012-05-19 11 views
14

नहीं कहा जाता है, मैं एक एंड्रॉइड एप्लिकेशन पर काम कर रहा हूं जहां मैंने संपत्ति फ़ोल्डर में मौजूदा स्क्लाइट डेटाबेस का उपयोग किया था। तो मैं वास्तव में उस फ़ोल्डर से डेटाबेस की प्रतिलिपि बनाएँ। उपयोगकर्ता अपना डेटा भी सहेज सकता है (किसी भी सामग्री को पसंदीदा के रूप में चिह्नित करें)।स्क्लाइट डेटाबेस ऑनअपग्रेड() को

मैंने बाजार में एक संस्करण अपलोड किया। अब मैं डेटाबेस में कुछ नया डेटा जोड़ना चाहता हूं और एक नया संस्करण अपलोड करना चाहता हूं। यदि उपयोगकर्ता बाजार से ऐप अपडेट करता है तो मैं उपयोगकर्ता डेटा (पिछले संस्करण से) रखना चाहता हूं और नया डेटा भी जोड़ना चाहता हूं। मैंने कुछ Google किया है और पाया है कि अपग्रेड विधि पर चाल चलनी चाहिए। लेकिन मैं कोड से DATABASE_VERSION बदल रहा हूं लेकिन अपग्रेड विधि पर कॉल नहीं मिलता है। मुझे आश्चर्य है कि मैंने कुछ याद किया है।

public class DataBaseHelper extends SQLiteOpenHelper { 

private static String DB_PATH = "/data/data/riskycoder.login/databases/"; 
public static String DB_NAME = "datenbank_EN.sqlite"; 
private SQLiteDatabase myDataBase; 
private final Context myContext; 
private static final int DATABASE_VERSION = 1; 





public DataBaseHelper(Context context) { 
    super(context, DB_NAME, null, DATABASE_VERSION); 
    this.myContext = context; 
} 

public void createDataBase() throws IOException { 
    boolean dbExist = checkDataBase(); 
    if (dbExist) { 
    } else { 
     this.getWritableDatabase(); 
     try { 
      this.close(); 
      copyDataBase(); 
     } catch (IOException e) { 
      throw new Error("Error copying database"); 
     } 
    } 

} 

private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 
    try { 
     String myPath = DB_PATH + DB_NAME; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE); 
    } catch (SQLiteException e) { 
    } 
    if (checkDB != null) 
     checkDB.close(); 
    return checkDB != null ? true : false; 
} 

private void copyDataBase() throws IOException { 

    InputStream myInput = myContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[2048]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

    //myDataBase.setVersion(DATABASE_VERSION); 
} 

public void openDataBase() throws SQLException { 
    String myPath = DB_PATH + DB_NAME; 
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE); 
    Log.d("Test", "Database version: " +myDataBase.getVersion()); 
} 

@Override 
public synchronized void close() { 
    if (myDataBase != null) 
     myDataBase.close(); 
    super.close(); 
} 



@Override 
public void onCreate(SQLiteDatabase db) { 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.d("Test", "in onUpgrade. Old is: " + oldVersion + " New is: " + newVersion); 


} 

}

+0

* मैं .. * कोड से DATABASE_VERSION बदल रहा हूँ, वास्तव में क्या इसका मतलब यह है है? मैं देखता हूं कि आप 'SQLiteOpenHelper' के निरंतर फ़ील्ड' DATABASE_VERSION' (जो स्पष्ट रूप से बदला नहीं जा सकता) के सुपर कन्स्ट्रक्टर को कॉल करते हैं, तो आप डेटाबेस संस्करण को वास्तव में कैसे बदलते हैं? – Luksprog

+0

एप्लिकेशन के नए संस्करण में मैंने DATABASE_VERSION को 2 में बदल दिया है। इसलिए नए संस्करण को इंस्टॉल करते समय ऑन अपग्रेड विधि को कॉल किया जाना चाहिए। या मुझे कुछ याद आ रहा है? – rawcoder064

+0

सबसे पहले, आपके द्वारा पोस्ट किया गया कोड शोटा DATABASE_VERSION 1 है, इसलिए अपग्रेड पर कॉल नहीं किया जाएगा।दूसरा, भले ही यह 2 था, आपके ऑन अपग्रेड में डेटाबेस अपडेट करने के लिए कोई भी कोड करने के लिए कोई कोड नहीं है। यह स्वचालित रूप से नहीं होता है, आपको इसे करना है। – Barak

उत्तर

18

onUpgrade() केवल कहा जाता है यदि डेटाबेस में बदलाव संस्करण संख्या का पता चला है। इस प्रकार डेटाबेस संस्करण को बढ़ा:

private static final int DATABASE_VERSION = 2; 
+0

उसे बहुत अच्छा काम नहीं करेंगे के रूप में सभी onUpgrade करता है (कम से कम पोस्ट कोड के साथ) थूक से बाहर है एक लॉग संदेश – Barak

+1

ओपी पूछा, "क्यों 'ऑन अपग्रेड' विधि को कॉल नहीं किया जाता है। " बेशक यह केवल एक लॉग संदेश थूक जाएगा क्योंकि उसने अभी तक 'अपग्रेड' लागू नहीं किया है। –

+0

@ एलेक्स लॉकवुड-> मैंने DATABASE_VERSION को 2 में बदल दिया है जैसा आपने कहा था लेकिन लॉगकट आउटपुट में कुछ भी नहीं दिखाया गया है। मैंने SQLite ब्राउज़र द्वारा डेटाबेस बनाया है। डेटाबेस बनाने के दौरान मुझे कोई संस्करण करना चाहिए? – rawcoder064

2

इस (DATABASE_VERSION वृद्धि) की कोशिश करो & onUpdate() कहा जाएगा: यहाँ मेरी कोड है

private static final int DATABASE_VERSION = 2; 
+0

यह कहा जाता हो जाएगा के डेटाबेस के उन्नयन और कुछ भी नहीं है ... – Barak

+0

@ Barak->() का परीक्षण करने के मैं onUpgrade में log.d बयान रखा है क्या करने के लिए कठिनाई का सामना करना पड़ रहा है। लेकिन मैं logcat आउटपुट में कुछ भी नहीं देखता। इसका मतलब है कि अपग्रेड को कॉल नहीं किया जाता है। OpenDataBase() विधि में मैंने log.d कथन डाला है। मैं देख सकता हूँ डेटाबेस संस्करण हमेशा 1 है, भले ही मैं 2. DATABASE_VERSION बदलने – rawcoder064

2

मान लिया जाये कि आप DATABASE_VERSION बदल दिया है, तो आप अभी भी यह ऐसा करने के लिए onUpgrade में कोड रखना होगा। यह जादुई नहीं है, आपको यह बताना होगा कि क्या करना है।

अपने मामले में आप की जरूरत है:

1) पुराने डेटाबेस प्रतिलिपि करें (यह एक नया नाम देना)
2) अपने नए डेटाबेस
3 में कॉपी) पुराने डेटाबेस से डेटा पढ़ने
4) नए डेटाबेस
5) को हटाने के पुराने डेटाबेस

संपादित में कोई अंतर कॉपी

मान लिया जाये कि आप संपत्ति में डीबी जहाज फ़ोल्डर तुम इतनी तरह उपयोग के लिए इसे कॉपी जाएगा:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    // First copy old db 
    InputStream bakInput = getActivity().getAssets().open(dbname); 
    String bakFileName = getActivity().getAssets() + "YourDB.old"; 
    OutputStream bakOutput = new FileOutputStream(bakFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = bakInput.read(buffer)) > 0) { 
     bakOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

    // delete the old db 
    File delDB = new File(getActivity().getAssets() + "YourDB"); 
    boolean deleted = file.delete(); 

    // Copy in the new db 
    InputStream myInput = getActivity().getAssets().open("YourDB"); 
    String outFileName = MAIN_DB_PATH + dbname; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = myInput.read(buffer)) > 0) { 
     myOutput.write(buffer, 0, length); 
    } 
    myOutput.flush(); 
    myOutput.close(); 
    myInput.close(); 

    // add code here to get changes user has made to db and move them to updated db 

    // delete the old db copy 
    File delDB = new File(getActivity().getAssets() + "YourDB.old"); 
    boolean deleted = file.delete(); 
} 
+0

क्षमा करें मैं आपको नहीं मिला। मेरे मामले में मैं नया डेटाबेस कैसे कॉपी करूं? आप कुछ कोड पोस्ट करें सकते हैं कि कैसे मैं कि क्या करते हो ....... मेरी मूर्खतापूर्ण सवाल के लिए खेद है ... – rawcoder064

+0

@Barak यू मेरी मदद कर सकते आपका जवाब मेरी onUpgrade विधि कहा जाता है नहीं किया जा रहा है – Erum

6

निम्नलिखित

करने के लिए अपने onUpgrade बदलें
@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

      if(newVersion > oldVersion){      
        myContext.deleteDatabase(DB_NAME); 
      } 
     } 

और यह भी नीचे की तरह अपने createDataBase() बदलने के लिए,

public void createDataBase() throws IOException{ 

      boolean dbExist = checkDataBase(); 

      if(dbExist){ 
       // By calling this method here onUpgrade will be called on a 
       // writable database, but only if the version number has been increased 

       this.getWritableDatabase(); 
      } 

      dbExist = checkDataBase(); 

      if(!dbExist){ 

       //By calling this method an empty database will be created into the      default system path 
        //of the application so we will be able to overwrite that database with our database. 
       this.getReadableDatabase(); 

       try { 

        copyDataBase(); 

       } catch (IOException e) { 

        throw new Error("Error copying database"); 

       } 
      } 

     } 

अंत में अपने डेटाबेस संस्करण को बढ़ाएं और इसे फिर से चलाएं। onUpgrade तब तक कॉल नहीं किया जाता जब तक कि आप getReadableDatabase() या इसी तरह के फ़ंक्शंस को कॉल न करें।

आशा इस मदद करता है

+0

मैं का पालन किया है, लेकिन अभी भी मेरी onUpgrade विधि को बुलाया नहीं जा सकता है क्या आप मेरी मदद कर सकते हैं – Erum

संबंधित मुद्दे