2017-08-05 115 views
-1

碰撞報告中出現錯誤android.database.sqlite.SQLiteException。但是我的應用程序通過自己的電話和模擬器正常工作。Android SQLiteException崩潰

java.lang.RuntimeException: 

    at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2319) 

    at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2379) 

    at android.app.ActivityThread.access$800 (ActivityThread.java:147) 

    at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1284) 

    at android.os.Handler.dispatchMessage (Handler.java:102) 

    at android.os.Looper.loop (Looper.java:135) 

    at android.app.ActivityThread.main (ActivityThread.java:5257) 

    at java.lang.reflect.Method.invoke (Method.java) 

    at java.lang.reflect.Method.invoke (Method.java:372) 

    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:899) 

    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694) 
Caused by: android.database.sqlite.SQLiteException: 

    at android.database.sqlite.SQLiteConnection.nativePrepareStatement (SQLiteConnection.java) 

    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.SQLiteStatement.<init> (SQLiteStatement.java:31) 

    at android.database.sqlite.SQLiteDatabase.executeSql (SQLiteDatabase.java:1676) 

    at android.database.sqlite.SQLiteDatabase.execSQL (SQLiteDatabase.java:1607) 

    at DictionaryDB2.addBook (DictionaryDB2.java) 

    at <OR>.getBookmarkedWords (DictionaryDB2.java) 

    at <OR>.deleteEntry (DictionaryDB2.java) 

    at <OR>.addHistory (DictionaryDB2.java) 

    at Word.onCreate (Word.java) 

    at android.app.Activity.performCreate (Activity.java:6018) 

    at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1105) 

    at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2272) 

數據庫初始化:

public class DatabaseInitializer2 extends SQLiteOpenHelper { 

    private static String DB_NAME = "bookmark"; 
    private static final int DB_VERSION = 59; 

    private static final String TAG = DatabaseInitializer2.class.getName(); 

    public DatabaseInitializer2(Context context) { 
     super(context, DB_NAME, null, DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_BOOK_TABLE = "CREATE TABLE IF NOT EXISTS bookmark (" + 
       "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       "en_word TEXT, "+ 
       "bn_word TEXT, "+ 
       "status TEXT, "+ 
       "user_created TEXT)"; 

     String CREATE_HISTORY_TABLE = "CREATE TABLE history (" + 
       "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       "en_word TEXT, "+ 
       "bn_word TEXT, "+ 
       "status TEXT, "+ 
       "user_created TEXT, "+ 
       "UNIQUE (en_word) ON CONFLICT REPLACE)"; 

     db.execSQL(CREATE_BOOK_TABLE); 

     db.execSQL(CREATE_HISTORY_TABLE); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     this.onCreate(db); 
    } 
} 

這是DictionaryDB2.addBook方法:

public void addBook(String englishWord, String banglaWord) { 
     SQLiteDatabase db = initializer.getWritableDatabase(); 

     String sql = "INSERT INTO " + BOOK_NAME + " (" + ENGLISH + 
       ", " + BANGLA + ") VALUES ('" + englishWord + 
       "', '" + banglaWord + "') "; 
     db.execSQL(sql); 
    } 

這是我getBookmarkedWords:

public List<Bean> getBookmarkedWords() { 
     SQLiteDatabase db = initializer.getReadableDatabase(); 

     String sql = "SELECT * FROM " + BOOK_NAME + " ORDER BY " + ID + " DESC "; 

     Cursor cursor = db.rawQuery(sql, null); 

     List<Bean> wordList = new ArrayList<Bean>(); 
     while(cursor.moveToNext()) { 
      int id = cursor.getInt(0); 
      String english = cursor.getString(1); 
      String bangla = cursor.getString(2); 
      String status = cursor.getString(3); 
      wordList.add(new Bean(id, english, bangla, status)); 
     } 

     cursor.close(); 
     db.close(); 
     return wordList; 
    } 

#2不允許我添加更多的代碼。任何人都知道我的代碼中出了什麼問題?

+0

發佈完整的錯誤 –

+0

發表完整的崩潰報告。 Stackoverflow不允許我以前點。 – user2872856

+0

你是什麼意思,不允許我添加更多的代碼? –

回答

-1

我建議你使用內容值而不是execsql的方法插入。

/編輯/

public DatabaseInitializer2(Context context, String name, 
SQLiteDatabase.CursorFactory 
factory, int version) { 
    super(context, name, factory, version); 
} 

嘗試與構造函數,而不是你的。我在代碼的其餘部分沒有檢測到任何錯誤。如果錯誤仍然存​​在,後期從SQLiteOpenHelper擴展類,所以我們可以檢查它太

+0

檢查了我編輯的問題。 'getBookmarkedWords'方法沒有使用'execSQL',但它導致了崩潰。 – user2872856

+0

檢查我編輯以上 – Kanayel

+0

我已經發布了我的類的完整代碼,它擴展了'SQLiteOpenHelper' – user2872856

-2

您需要將上面的行添加

cursor.moveToFirst(); 

while(cursor.moveToNext()) { 
     int id = cursor.getInt(0); 
     String english = cursor.getString(1); 
     String bangla = cursor.getString(2); 
     String status = cursor.getString(3); 
     wordList.add(new Bean(id, english, bangla, status)); 
    } 

權利,改成這樣:

while(!cursor.isAfterLast()) { 
     int id = cursor.getInt(0); 
     String english = cursor.getString(1); 
     String bangla = cursor.getString(2); 
     String status = cursor.getString(3); 
     wordList.add(new Bean(id, english, bangla, status)); 
     cursor.moveToNext(); 
    }