我知道这个问题以前被问过很多次,但在本例中是不同的,因为错误只发生在试图将图像保存到数据库时,而其他问题不是处理图像。如果有一个,请与链接评论。
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组。在从中访问数据之前,请确保光标已正确初始化。
如果数据库中已经存储了没有图像的普通便笺,为什么不返回记录?
Android sqlite游标有一个名为cursorwindow
的固定大小的内部缓冲区,在大多数配置中为2MB。试图在光标行中移动更多数据是行不通的。
不要在Android sqlite数据库中存储图像数据或任何其他大型数据。相反,将图像存储到文件系统,并将文件路径存储在数据库中。
我使用下面的代码来处理一个临时SQLite表: 将数据保存到临时:
问题内容: 我已经将游标初始化如下: 游标本身在同一活动中的单独方法中使用: 它给了我以下错误: 每次我重新运行应用程序时,堆栈跟踪都指向此行。那里总是会给出一个错误。 该数据库是这样的: 我在SO上阅读了几篇类似的文章,但它们并没有使我知道出了什么问题。任何输入表示赞赏。 问题答案: 游标的列索引从零开始,因此请更改: 到
我已经创建了一个非常简单的数据库android应用程序。它接受输入并显示结果。添加按钮用于添加输入,删除按钮用于删除存储在SQLite数据库中的输入。我在Android SQLite中的光标指向正确,但仍然面临错误:由:java.lang.IllegalStateException引起:无法从CursorWindow读取第0,col-1行。在从中访问数据之前,请确保光标已正确初始化。以下是游标部分
这就是问题所在,我找不到错误在哪里,因为stacktrace不指向我的项目的类,而是指向android原生的类。我尝试在代码的每个部分都放断点,但是当我单击子代码时,没有一个断点被访问。 顺便说一下,我使用ViewHolder模式来处理视图,适配器是一个CursorTreeAdapter 下面是我的代码--完整的stacktrace在最后:
日志猫 由:java.lang.IllegalStateException引起:无法从CursorWindow读取第0行,第5行。在从中访问数据之前,请确保光标已正确初始化。在Android.database.cursorwindow.nativegetString(本机方法)在Android.database.cursorwindow.getString(cursorwindow.java:46
TextWatcher代码: LogCat错误: