在访问之前确保 Cursor 被正确初始化
Make sure the Cursor is initialized correctly before accessing
我使用下一个代码来玩一个临时的 SQLite table:
public class DBHelperForTemp extends SQLiteOpenHelper {
private final static String DB_NAME = "tempdb";
private final static int DB_VERSION = 3;
public DBHelperForTemp(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE tbl ( ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, image BLOB )";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS tbl");
onCreate(db);
}
public boolean add_Temp_Values(String name, byte[] image) throws SQLiteException {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
contentValues.put("image", image);
long result = db.insert("tbl", null, contentValues);
return result != -1;
}
public Cursor get_Data(){
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM tbl";
return db.rawQuery(query, null);
}
public void ClearData(){
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("delete from tbl");
}
}
将数据保存到临时文件:
private void doTemp(){
final Bitmap photo = ((BitmapDrawable) mPhotoImageView.getDrawable()).getBitmap();
boolean insertData = mDBTemp.add_Temp_POI_Values(mNameEditText.getText().toString(),
Utils.imageToByteArray(photo) );
if (insertData){
Toast.makeText(this, R.string.fb_success, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, R.string.fb_error, Toast.LENGTH_SHORT).show();
}
finish();
}
并尝试从临时读取并发送到 firebase:
private void onSubmit(){
final DBHelperForTemp mDBTemp = new DBHelperForTemp(this);
final Cursor data = mDBTemp.get_Data();
if (data != null && data.getCount() != 0 && data.moveToFirst()){
for (int i = 0; i < data.getCount(); i++) {
final String name = data.getString(data.getColumnIndex("name"));
final byte[] byteArray = data.getBlob(data.getColumnIndex("image"));
final Bitmap photo = BitmapFactory.decodeByteArray(byteArray, 0 , byteArray.length);
.........
我在尝试使用它时收到下一个错误代码:
E/UncaughtException: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:451)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at com.test.test.activities.ActivityMain.onSubmit
有趣的是,如果我在临时 table 中没有图像,代码也能正常工作。如果有图像,应用程序会崩溃,但会尝试读取名称字符串而不是图像。
任何人都可以帮我检测问题吗?
data.getCount() return 1. data.getColumnIndex("name") return 0. data.getString(0) return 方法抛出 'java.lang.IllegalStateException' 异常。无法从 CursorWindow 读取第 0 行第 1 列。在从游标访问数据之前,确保游标已正确初始化。
可能是你存储的图片太大,CursorWindow每行最大尺寸为2048Kb
我使用下一个代码来玩一个临时的 SQLite table:
public class DBHelperForTemp extends SQLiteOpenHelper {
private final static String DB_NAME = "tempdb";
private final static int DB_VERSION = 3;
public DBHelperForTemp(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE tbl ( ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, image BLOB )";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS tbl");
onCreate(db);
}
public boolean add_Temp_Values(String name, byte[] image) throws SQLiteException {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("name", name);
contentValues.put("image", image);
long result = db.insert("tbl", null, contentValues);
return result != -1;
}
public Cursor get_Data(){
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM tbl";
return db.rawQuery(query, null);
}
public void ClearData(){
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("delete from tbl");
}
}
将数据保存到临时文件:
private void doTemp(){
final Bitmap photo = ((BitmapDrawable) mPhotoImageView.getDrawable()).getBitmap();
boolean insertData = mDBTemp.add_Temp_POI_Values(mNameEditText.getText().toString(),
Utils.imageToByteArray(photo) );
if (insertData){
Toast.makeText(this, R.string.fb_success, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, R.string.fb_error, Toast.LENGTH_SHORT).show();
}
finish();
}
并尝试从临时读取并发送到 firebase:
private void onSubmit(){
final DBHelperForTemp mDBTemp = new DBHelperForTemp(this);
final Cursor data = mDBTemp.get_Data();
if (data != null && data.getCount() != 0 && data.moveToFirst()){
for (int i = 0; i < data.getCount(); i++) {
final String name = data.getString(data.getColumnIndex("name"));
final byte[] byteArray = data.getBlob(data.getColumnIndex("image"));
final Bitmap photo = BitmapFactory.decodeByteArray(byteArray, 0 , byteArray.length);
.........
我在尝试使用它时收到下一个错误代码:
E/UncaughtException: java.lang.IllegalStateException: Couldn't read row 0, col 1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:451)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at com.test.test.activities.ActivityMain.onSubmit
有趣的是,如果我在临时 table 中没有图像,代码也能正常工作。如果有图像,应用程序会崩溃,但会尝试读取名称字符串而不是图像。
任何人都可以帮我检测问题吗?
data.getCount() return 1. data.getColumnIndex("name") return 0. data.getString(0) return 方法抛出 'java.lang.IllegalStateException' 异常。无法从 CursorWindow 读取第 0 行第 1 列。在从游标访问数据之前,确保游标已正确初始化。
可能是你存储的图片太大,CursorWindow每行最大尺寸为2048Kb