2016-08-25 43 views
0

我明白這個問題已經被問了很多次,但在這種情況下,它是不同的,因爲錯誤試圖將圖像保存到數據庫時纔會出現,而其他問題不涉及圖像。如果有人請評論鏈接。「確保光標從它訪問數據初始化之前的」 Android

首先我只是張貼我認爲這是必要的,所以如果我錯過了一些代碼或任何東西,請讓我知道代碼。我有一個筆記應用程序,它將2個不同的EditText字段存儲爲筆記標題和筆記主體。這工作正常。我嘗試添加功能來添加,存儲和檢索SQLite數據庫中的圖像。這是我的EditNoteActivity類中的代碼,在用戶完成編輯註釋並按下後退按鈕以轉到MainActivity類之後,在「存儲」操作期間運行。

private void updateNote(String noteText, String titleText) { 
     Log.d("Img", "updateNote"); 
     ContentValues values = new ContentValues(); 
     ImageView img = (ImageView) findViewById(R.id.imageView); 

     byte[] data; 
     if (img.getDrawable() != null) { 
      Log.d("Img", "updateNote ----- image here"); 
      Bitmap bitmap = ((BitmapDrawable)img.getDrawable()).getBitmap(); 
//  data = getBitmapAsByteArray(bitmap); 
      data = DbBitmapUtility.getBytes(bitmap); 
     } else { 
      Log.d("Img", "updateNote ----- image not here"); 
      data = null; 
     } 
     values.put(DBOpenHelper.NOTE_IMAGE, data); 
     values.put(DBOpenHelper.NOTE_BODY, noteText); 
     values.put(DBOpenHelper.NOTE_TITLE, titleText); 
     // reusing noteFilter value to make sure you're only updating 1 selected row 
     getContentResolver().update(NoteProvider.CONTENT_URI, values, noteFilter, null); 
     Toast.makeText(this, R.string.note_updated, Toast.LENGTH_SHORT).show(); 
     setResult(RESULT_OK); // send message to MainActivity saying something has changed, update content in list 
    } 

如果我不添加圖像到ImageView,那麼我可以保存註釋沒有問題。但是,如果我添加圖像,然後嘗試回去MainActivity,程序崩潰以下行:

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    cursorAdapter.swapCursor(data); // crashes here 
} 

,它也崩潰類聲明:

public class MainActivity extends AppCompatActivity 

,因爲我用的Log.da很多,但它說,在logcat中的以下內容:

updateNote updateNote -----形象在這裏

像它應該,如果您按照updateNote方法的代碼。這裏是getBytes方法在DbBitmapUtility類,我用它來得到一個字節數組用於圖像存儲爲BLOB:

// convert from bitmap to byte array 
public static byte[] getBytes(Bitmap bitmap) { 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream); 
    return stream.toByteArray(); 
} 

最後這裏是我的數據庫設置:

public static final String TABLE_NOTES = "notes"; 
public static final String NOTE_ID = "_id"; 
public static final String NOTE_TITLE = "noteTitle"; 
public static final String NOTE_BODY = "noteBody"; 
public static final String NOTE_IMAGE = "noteImage"; 
public static final String NOTE_CREATED = "noteCreated"; 

public static final String[] ALL_COLUMNS = 
     {NOTE_ID, NOTE_TITLE, NOTE_BODY, NOTE_IMAGE, NOTE_CREATED}; 
// SQL to create table 
private static final String TABLE_CREATE = 
     "CREATE TABLE " + TABLE_NOTES + " (" + 
       NOTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       NOTE_TITLE + " TEXT, " + 
       NOTE_BODY + " TEXT, " + 
       NOTE_IMAGE + " BLOB, " + 
       NOTE_CREATED + " TEXT default CURRENT_TIMESTAMP" + 
       ")"; 

這裏有錯誤:

E/AndroidRuntime:致命異常:主 工藝:com.beauty.comp_eng.mynote,PID:16435個 JA va.lang.IllegalStateException:無法從CursorWindow讀取第0行,第0列以及第 列。確保光標在 從其訪問數據之前正確初始化。 在android.database.CursorWindow.nativeGetLong(本機方法) 在android.database.CursorWindow.getLong(CursorWindow.java:511) 在 android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:75) 的機器人。 database.CursorWrapper.getLong(CursorWrapper.java:127) 在android.widget.CursorAdapter.getItemId(CursorAdapter.java:259) 在android.widget.AdapterView.rememberSyncState(AdapterView.java:1243) 在 android.widget .AdapterView $ AdapterDataSetObserver.onChanged(AdapterView.java:830) at android.widget.AbsListView $ AdapterDataSetObserver.onChanged(AbsListView.java:6470) 在 android.database.DataSetObservable.notifyChanged(DataSetObservable。的java:37) 在 android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50) 在android.widget.CursorAdapter.swapCursor(CursorAdapter.java:381) 在 com.beauty.comp_eng.mynote.MainActivity。 onLoadFinished(MainActivity.java:200) 在 com.beauty.comp_eng.mynote.MainActivity.onLoadFinished(MainActivity.java:25) 在 android.support.v4.app.LoaderManagerImpl $ LoaderInfo.callOnLoadFinished(LoaderManager.java: 479) at android.support.v4.app.LoaderManagerImpl $ LoaderInfo.onLoadComplete(LoaderManager.java:447) 在android.support.v4.content.Loader.deliverResult(Loader.java:126) 在 android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:105) 在 android.support.v4。 content.CursorLoader.deliverResult(CursorLoader.java:37) 在 android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:249) 在 android.support.v4.content.AsyncTaskLoader $ LoadTask.onPostExecute( AsyncTaskLoader.java:77) at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:466) at android.support.v4.content.ModernAsyncTask.access $ 400(ModernAsyncTask.java:48) 在 android.support.v4.content.ModernAsyncTask $ InternalHandler.handleMessage(ModernAsyncTask.java:483) 在android.os.Handler .dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5525) at java.lang.reflect.Method .invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:730) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

我以爲我正確地存儲圖像,因爲我發現這是他們在許多其他計算器中做的方式,但它不起作用。我注意到它說

無法從CursorWindow讀取0行,列0。在從中訪問數據之前,確保Cursor已正確初始化。

爲什麼沒有記錄被返回,如果有沒有圖像存儲在數據庫中的普通筆記?

回答

5

Android sqlite光標有一個固定大小的內部緩衝區,名爲CursorWindow,在大多數配置中它是2MB。試圖在光標行中移動更多數據將無法工作。

不要在Android sqlite數據庫中存儲圖像數據或任何其他大數據。相反,將圖像存儲到文件系統並將文件路徑存儲在數據庫中。

+0

我從來不知道,謝謝你的回答。我現在已經投票贊成,當我今天下班回家嘗試一下,我會接受你的回答 – Michael

相關問題