2014-07-08 13 views
13

हमारे पास हमारे एप्लिकेशन में एक स्क्लाइट डेटाबेस है। यह सभी उपयोगकर्ताओं के लिए ठीक काम कर रहा है लेकिन उनमें से कुछ Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings त्रुटि का अनुभव कर रहे हैं।के कारण: android.database.sqlite.SQLiteException: ऐसी कोई तालिका नहीं: (कोड 1) एंड्रॉइड

नीचे मेरी एसक्लाइट सहायक वर्ग डीबी और त्रुटि लॉग बनाने के लिए है। assert/Master.db में हमारे पास तालिका generalSettings है। लेकिन डिवाइस पर इसे कॉपी करने के बाद तालिका गुम है। यह केवल कुछ उपयोगकर्ताओं के लिए हो रहा है। मैंने समाधान की खोज की लेकिन मुझे सटीक नहीं मिला। टीम कृपया इसे ठीक करने में मेरी मदद करें।

कोड:

import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.PrintWriter; 
import java.io.StringWriter; 

import android.content.Context; 
import android.content.Intent; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.net.Uri; 
import android.util.Log; 

public class InstallDB extends SQLiteOpenHelper { 
    Context ctx; 

    String DBNAME; 
    String DBPATH; 
    Modules modObj = new Modules(); 

    public InstallDB(Context context, String name) { 
     super(context, name, null, 1); 
     this.ctx = context; 
     this.DBNAME = name; 

     this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath(); 
     Log.e("Path 1", DBPATH); 

    } 

    public void createDataBase() { 

     boolean dbExist = checkDataBase(); 

     SQLiteDatabase db_Read = null; 

     if (!dbExist) { 
      synchronized (this) { 

       db_Read = this.getReadableDatabase(); 
       Log.e("Path 2", this.getReadableDatabase().getPath()); 
       db_Read.close(); 

       copyDataBase(); 
       Log.v("copyDataBase---", "Successfully"); 
      } 

      // try { 

      // } catch (IOException e) { 
      // throw new Error("Error copying database"); 
      // } 
     } 
    } 

    private boolean checkDataBase() { 

     SQLiteDatabase checkDB = null; 

     try { 
      String myPath = DBPATH; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, 
        SQLiteDatabase.OPEN_READWRITE); 
     } catch (Exception e) { 
      Log.i("SQLite Error", "database does't exist yet."); 
     } 

     if (checkDB != null) { 
      checkDB.close(); 
     } 

     return checkDB != null ? true : false; 
    } 

    private void copyDataBase() { 

     try { 
      InputStream myInput = ctx.getAssets().open(DBNAME); 
      String outFileName = DBPATH; 

      OutputStream myOutput = new FileOutputStream(outFileName); 

      byte[] buffer = new byte[1024 * 3]; 

      int length = 0; 

      while ((length = myInput.read(buffer)) > 0) { 
       myOutput.write(buffer, 0, length); 
      } 

      myOutput.flush(); 
      myOutput.close(); 
      myInput.close(); 
     } catch (Exception e) { 
      Modules.stacTaceElement = e.getStackTrace(); 

      StringWriter stackTrace1 = new StringWriter(); 
      e.printStackTrace(new PrintWriter(stackTrace1)); 
      System.err.println(stackTrace1); 

      Intent send = new Intent(Intent.ACTION_SENDTO); 
      String uriText; 

      uriText = "mailto:[email protected]" 
        + "&subject=Error Report" 
        + "&body=" 
        + stackTrace1.toString(); 

      uriText = uriText.replace(" ", "%20"); 
      Uri uri = Uri.parse(uriText); 

      send.setData(uri); 
      ctx.startActivity(Intent.createChooser(send, "Send mail...")); 
      // TODO: handle exception 
     } 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    } 
} 

त्रुटि लॉग:

java.lang.RuntimeException: Unable to start activity ComponentInfo{palmagent.FidelityAgent.Two/palmagent.FidelityAgent.Two.PassNew}: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2269) 
at android.app.ActivityThread.access$800(ActivityThread.java:139) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:136) 
at android.app.ActivityThread.main(ActivityThread.java:5102) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.database.sqlite.SQLiteException: no such table: generalSettings (code 1): , while compiling: select * from generalSettings 
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314) 
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253) 
at palmagent.FidelityAgent.Two.masterDatabase.selectquery(masterDatabase.java:59) 
at palmagent.FidelityAgent.Two.Modules.checkDatabase(Modules.java:28825) 
at palmagent.FidelityAgent.Two.PassNew$LoaduserDetails.onPreExecute(PassNew.java:140) 
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 
at android.os.AsyncTask.execute(AsyncTask.java:535) 
at palmagent.FidelityAgent.Two.PassNew.onCreate(PassNew.java:120) 
at android.app.Activity.performCreate(Activity.java:5248) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2173) 
... 11 more 
+0

क्या आप अपने डेटाबेस की एक तैनात प्रतिलिपि लिख रहे हैं जिस पर एंड्रॉइड बनाया जाएगा? मुझे लगता है कि यह एक बुरा विचार है क्योंकि एंड्रॉइड डेटाबेस में कुछ निजी डेटा रखता है। – brummfondel

+0

@brummfondel - हमारे पास डीबी में 10 टेबल और कुछ स्थिर डेटा हैं। तो डीबी बनाने में काफी समय लगेगा। तो हमने एंड्रॉइड में डेटाबेस की प्रतिलिपि बनाई। कृपया मुझे ऐसा करने का सबसे अच्छा तरीका बताएं। – Sniper

+0

कुछ उपकरणों और अनुकरणकर्ताओं पर मेरे ऐप का परीक्षण करने के बाद मुझे एक ही समस्या का सामना करना पड़ रहा है http://stackoverflow.com/questions/24406326/no-such-table-in-api-2-2 –

उत्तर

18

समस्या है, क्योंकि उपकरण की कुछ अपने अनुप्रयोग अपग्रेड हो रहा है, इसलिए checkDataBase(), true लौटने ताकि आप copyDataBase() बुला नहीं कर रहे हैं। तो आप पिछले डेटाबेस का उपयोग कर रहे हैं जिसमें generalSettings तालिका नहीं है। इस कोशिश को हल करने के लिए:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
if(newVersion>oldVersion) 
    copyDatabase(); 
} 

और भी अपने निर्माता अद्यतन:

public InstallDB(Context context, String name) { 
    super(context, name, null, DB_VERSION); 
    // DB_VERSION is an int,update it every new build 

    this.ctx = context; 
    this.DBNAME = name; 
    this.DBPATH = this.ctx.getDatabasePath(DBNAME).getAbsolutePath(); 
    Log.e("Path 1", DBPATH); 

} 
+0

यदि इस उत्तर ने आपकी समस्या हल की है, तो कृपया इसे सही उत्तर के रूप में चिह्नित करें। –

+0

क्या OnUpgrabde को वास्तव में पुराने संस्करण से कम एक नया संस्करण कहा जा सकता है? –

+0

हाँ यह कॉल करेगा। –

0

यह एक उन्नयन अपवाद है। सुनिश्चित करें कि आपके पिछले डेटाबेस में टेबल है। यदि नहीं, तो इसे बनाएं। पीएस: यदि आप इस ऐप को नए देव हैं, तो इसे अपने एमुलेटर या अपने डिवाइस से अनइंस्टॉल करें और पुनः इंस्टॉल करें। लेकिन डेटा के लिए इसकी सिफारिश नहीं की जाएगी।

3

यह त्रुटि होती है क्योंकि आप DATABASE_VERSION

उपयोग नहीं कर रहे
public class DatabaseHelper extends SQLiteOpenHelper { 
    private static SQLiteDatabase sqliteDb; 

    private static DatabaseHelper instance; 

    private static final int DATABASE_VERSION = 1; 

आपका संस्करण हर बार जब आप अपने डेटाबेस में परिवर्तन बस +1 के साथ DATABASE_VERSION वृद्धि कर बढ़ाएँ ..

5

एक अन्य संभावित समाधान सिर्फ एक की स्थापना रद्द कर रहा है एंड्रॉइड एमुलेटर से ऐप और इसके बाद इसे फिर से चलाएं।

तुम सिर्फ एक आवेदन को निकालना चाहते हैं:

1.Start the emulator. 
2.Open the Android settings app. 
3.Select "Applications" (Called "Apps" on Android 4.0 or higher) 
4.Select "Manage Applications" (Only on Android 3.2 or lower) 
5.Select the application you want to uninstall. 
6.Click "Uninstall" 
0

1.Change अपने डेटाबेस संस्करण या प्रथम स्थापना रद्द एम्यूलेटर या फोन और में आपकी ऐप्लिकेशन को पुन: इंस्टॉल । मैं इस तरह से सोचता हूं कि आपकी समस्या हल हो जाएगी।

0

यदि आप ग्रीनडाओ का उपयोग कर रहे हैं और यह त्रुटि प्राप्त करते हैं, तो सुनिश्चित करें कि आप ऐप को अनइंस्टॉल कर रहे हैं और पुनः प्रयास करें।इस घंटे की जोड़ी खर्च करने के बाद मेरी समस्या

9

हल मैं इस समाधान मिल गया:

1) सेटिंग> अनुप्रयोग प्रबंधक

2) का चयन अनुप्रयोग

3) डेटा साफ़

4) अनइंस्टॉल ऐप

अब एंड्रॉइड स्टूडियो

से ऐप चलाएं

उम्मीद है कि यह ठीक से काम करता है

+0

यह मेरे लिए काम करता है धन्यवाद। –

0

मान लीजिए कि क्या आप अपना संस्करण डेटाबेस संस्करण 1 के साथ चलाते हैं, तो यदि आप तालिका संरचना को बदलते हैं या एक नई तालिका जोड़ते हैं, तो आपको अपना डेटाबेस संस्करण 2 और आगे बढ़ाना होगा यदि आप और अधिक परिवर्तन करते हैं यह।

public class AppDatabase extends SQLiteOpenHelper { 

    // Database Name 
    private static final String DATABASE_NAME = "myDatabase"; 

    // Database Version 
    private static final int DATABASE_VERSION = 1;  

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

यदि कोई बदलाव किया जाता है तो इस DATABASE_VERSION मान को बढ़ाएं।

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