当前位置: 首页 > 知识库问答 >
问题:

“在访问Cursor数据之前,请确保Cursor已初始化”Android

钮安歌
2023-03-14

我知道这个问题以前被问过很多次,但在本例中是不同的,因为错误只发生在试图将图像保存到数据库时,而其他问题不是处理图像。如果有一个,请与链接评论。

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
    }
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    cursorAdapter.swapCursor(data);    // crashes here
}
public class MainActivity extends AppCompatActivity

因为我经常使用log.d,所以它确实在logcat中表示以下内容:

updateNote updateNote----此处图像

如果您遵循updateNote方法中的代码,就应该如此。下面是DbBitmapUtility类中的getBytes方法,我使用它来获取字节数组,以便将图像存储为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" +
                ")";

无法从CursorWindow读取第0行,第0组。在从中访问数据之前,请确保光标已正确初始化。

如果数据库中已经存储了没有图像的普通便笺,为什么不返回记录?

共有1个答案

胡禄
2023-03-14

Android sqlite游标有一个名为cursorwindow的固定大小的内部缓冲区,在大多数配置中为2MB。试图在光标行中移动更多数据是行不通的。

不要在Android sqlite数据库中存储图像数据或任何其他大型数据。相反,将图像存储到文件系统,并将文件路径存储在数据库中。

 类似资料: