我试图将对象保存到sqlite中,并且该对象的类已实现Serializable。但总有一个错误:
android.database.sqlite.SQLiteException: unrecognized token:
"[Ljava.lang.Object;@277c81d9" (code 1): , while compiling: insert
into mClass(classData) values(?)[Ljava.lang.Object;@277c81d9
这是我的代码:
public boolean add(ReturnInfo ri) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
db = dh.getWritableDatabase();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(ri);
oos.flush();
byte[] data = bos.toByteArray();
bos.close();
oos.close();
db.execSQL("insert into mClass(classData) values(?)" + new Object[]{data});
db.close();
Log.e("db", "insert succeeded");
return true;
} catch (Exception e) {
e.printStackTrace();
Log.e("db", "insert failed");
return false;
}
数据库已成功创建,我不知道哪里出错了。
答案 0 :(得分:1)
问题是您以错误的方式使用预准备语句。
db.execSQL("insert into mClass(classData) values(?)" + new Object[]{data});
在这里,您生成了不合适的SQL语句,因为您只需将一个对象添加到字符串的末尾,最后得到如下内容:
"insert into mClass(classData) values(?)[Ljava.lang.Object;@277c81d9"
这不是SQL语句。
要使用预准备语句,您需要编写以下内容:
SQLiteStatement stmt =
db.compileStatement("insert into mClass(classData) values(?)");
stmt.bindString(1, data);
stmt.execute()
另外,请查看this问题,以便更好地了解android中的预处理语句。