2016-12-05 3 views
1

Я создал базу данных sqlite внутри своего приложения и пытаясь сохранить выделенный текст, сохранение все работает нормально, даже исправление всех основных моментов работает нормально, но когда я запрашиваю основные моменты, основанные на имени book i am получаю ошибкуЗапрос базы данных Sqlite на основе имени строки

вот что я пытался до сих пор

это мой OnCreate базы данных SQLite

@Override 
public void onCreate(SQLiteDatabase db) { 


    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_HIGHLIGHTS + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY," +KEY_BOOKNAME +" TEXT," + KEY_HIGHLIGHT+" TEXT," + KEY_TEXTSIZE + " INTEGER," 
      + KEY_PAGENO + " INTEGER" + ")"; 
    db.execSQL(CREATE_CONTACTS_TABLE); 


} 

Это работает отлично

public List<HighlightSave> getAllHighlights(){ 

    List<HighlightSave> saveAllHighlights=new ArrayList<HighlightSave>(); 

    String selectQuery="SELECT * FROM "+TABLE_HIGHLIGHTS; 

    SQLiteDatabase db=this.getWritableDatabase(); 

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

    if(cursor.moveToFirst()){ 

     do{ 
      HighlightSave hs=new HighlightSave(); 
      hs.setBookName(cursor.getString(1)); 
      hs.setHighlightedText(cursor.getString(2)); 

      hs.setTextSize(Integer.parseInt(cursor.getString(3))); 
      hs.setPageno(Integer.parseInt(cursor.getString(4))); 

      saveAllHighlights.add(hs); 


     }while(cursor.moveToNext()); 

    } 


    cursor.close(); 
    db.close(); 
    return saveAllHighlights; 

} 

Проблема заключается в том, когда я пытаюсь запрос с использованием BookName, как показано ниже

public List<HighlightSave> getBookHighlights(String bookname){ 

    SQLiteDatabase db= this.getReadableDatabase(); 

    List<HighlightSave> AllHighlightsOfBook= new ArrayList<HighlightSave>(); 

     Cursor cursor = db.query(TABLE_HIGHLIGHTS, new String[] {KEY_BOOKNAME,KEY_HIGHLIGHT,KEY_TEXTSIZE,KEY_PAGENO}, KEY_BOOKNAME + "=?", new String[] { bookname }, null, null, null, null); 

    if(cursor.moveToFirst()){ 

     do{ 
      HighlightSave hs=new HighlightSave(); 
      hs.setBookName(cursor.getString(1)); 
      hs.setHighlightedText(cursor.getString(2)); 

      hs.setTextSize(Integer.parseInt(cursor.getString(3))); 
      hs.setPageno(Integer.parseInt(cursor.getString(4))); 

      AllHighlightsOfBook.add(hs); 


     }while(cursor.moveToNext()); 

    } 

    cursor.close(); 
    db.close(); 


    return AllHighlightsOfBook; 
} 

я получаю эту ошибку

12-05 11:03:48.025: E/AndroidRuntime(8811): FATAL EXCEPTION: main 
12-05 11:03:48.025: E/AndroidRuntime(8811): Process: com.wowio.ebookreader, PID: 8811 
12-05 11:03:48.025: E/AndroidRuntime(8811): java.lang.IllegalStateException: Couldn't read row 0, col 4 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.database.CursorWindow.nativeGetString(Native Method) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.database.CursorWindow.getString(CursorWindow.java:438) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at com.eminosoft.epubreader.HighlightDatabase.getBookHighlights(HighlightDatabase.java:160) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at com.eminosoft.epubreader.HighlightFragment.onActivityCreated(HighlightFragment.java:66) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:958) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.os.Handler.handleCallback(Handler.java:739) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.os.Handler.dispatchMessage(Handler.java:95) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.os.Looper.loop(Looper.java:148) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at android.app.ActivityThread.main(ActivityThread.java:5422) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at java.lang.reflect.Method.invoke(Native Method) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
12-05 11:03:48.025: E/AndroidRuntime(8811):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

так я думал, что какая-то проблема с курсором так инициализирован это таким образом внутри getBookHighlights ()

String query = "Select * from "+TABLE_HIGHLIGHTS+ " Where " +KEY_BOOKNAME + " = " + bookname ; 
    Cursor cursor= db.rawQuery(query,null); 

тогда я получаю эту ошибку

12-05 11:20:06.514: E/AndroidRuntime(12305): FATAL EXCEPTION: main 
12-05 11:20:06.514: E/AndroidRuntime(12305): Process: com.wowio.ebookreader, PID: 12305 
12-05 11:20:06.514: E/AndroidRuntime(12305): android.database.sqlite.SQLiteException: near "Raven": syntax error (code 1): , while compiling: Select * from highlights Where book_Name = The Raven 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at com.eminosoft.epubreader.HighlightDatabase.getBookHighlights(HighlightDatabase.java:146) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at com.eminosoft.epubreader.HighlightFragment.onActivityCreated(HighlightFragment.java:66) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:958) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.os.Handler.handleCallback(Handler.java:739) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.os.Handler.dispatchMessage(Handler.java:95) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.os.Looper.loop(Looper.java:148) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at android.app.ActivityThread.main(ActivityThread.java:5422) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at java.lang.reflect.Method.invoke(Native Method) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
12-05 11:20:06.514: E/AndroidRuntime(12305): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Что я делаю неправильно? (Я удалил приложение перед каждым бежать, так что не будет никаких проблем с предыдущей базы данных)

+0

Вы тестируете на эмуляторе? –

+0

no onreal device nexus 6p – Redman

+0

можете ли вы протестировать эмулятор на один раз? запустить приложение и открыть sqlite db из adm и проверить, есть ли в таблице данные –

ответ

2

Исправьте ваш ЗЕЬЕСТ запрос на первый

String query = "SELECT * FROM " + TABLE_HIGHLIGHTS+ " WHERE " + KEY_BOOKNAME + " = '" + bookname + "'"; 

Затем Удаление старого приложения и запустить снова.

+1

Работал полностью, спасибо bro – Redman

1
String query="select * from "+TABLE_HIGHLIGHTS+" where "+KEY_BOOKNAME+"='"+bookname+"'"; 
+1

Спасибо он работает, но intellij ответил ему первым, так что согласился на его ответ, любым способом +1 спасибо за помощь :) – Redman

+0

ya no proble.Thanks for +1 –

2

Ошибка, связанная с получением значений столбца.

Индекс столбца начинается с нуля в курсе Sqlite.

java.lang.IllegalStateException: Couldn't read row 0, col 4 from CursorWindow.

Так смысл выше линии 4 столбец не доступен в объекте курсора

Ваша попытка с 0 до 3. Я думаю, что он должен быть решен.

+0

не пробовал этот ответ, потому что выше ответ работал нормально, поэтому я придерживаюсь этого в любом случае спасибо за помощь +1 :) – Redman

Смежные вопросы