我明白這個問題已經被問了很多次,但在這種情況下,它是不同的,因爲錯誤試圖將圖像保存到數據庫時纔會出現,而其他問題不涉及圖像。如果有人請評論鏈接。「確保光標從它訪問數據初始化之前的」 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已正確初始化。
爲什麼沒有記錄被返回,如果有沒有圖像存儲在數據庫中的普通筆記?
我從來不知道,謝謝你的回答。我現在已經投票贊成,當我今天下班回家嘗試一下,我會接受你的回答 – Michael