2017-08-05 157 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(); 
    }