插入时数据类型不匹配(代码 20)
Datatype mismatch (code 20) while inserting
在我的项目中,我使用 sqlite 数据库来保存图片及其位置。我在尝试将数据插入我的数据库时遇到此错误:
E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO PHOTO VALUES(NULL,?,?,?,?)] datatype mismatch
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tomer.finalproject, PID: 18550
android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:786)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:926)
这是我的代码:
在名为 SQLiteOpenHelper 的 class 中的插入方法:
public void insertData(String name, String lat, String lon, byte[] image) {
SQLiteDatabase database = getWritableDatabase();
String sql = "INSERT INTO PHOTO VALUES(NULL,?,?,?,?)";
SQLiteStatement statement = database.compileStatement(sql);
statement.clearBindings();
statement.bindString(1, name);
statement.bindString(2, lat);
statement.bindString(3, lon);
statement.bindBlob(4, image);
statement.executeInsert();
}
我在另一个按钮 'add' 中调用它 activity :
那两行在 onCreate 下
sqLiteHelper=new SQLiteHelper(this,"GalleryDB.sqlite",null,1);
sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS PHOTO (name VARCHAR,lat VARCHAR,lon VARCHAR,image BLOG,Id INTEGER PRIMARY KEY AUTOINCREMENT)");
这是我的添加按钮:
btnadd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GPStracker g = new GPStracker(getApplicationContext());
Location l = g.getLocation();
if (l != null) {
double lat = l.getLatitude();
double lon = l.getLongitude();
String stLat= String.valueOf(lat);
String stLon= String.valueOf(lon);
try{
Toast.makeText(getApplicationContext(), "Saved To Gallery!", Toast.LENGTH_SHORT).show();
sqLiteHelper.insertData(etname.getText().toString().trim(),stLat.trim(),stLon.trim(),imageViewToByte(imageView));
}
catch (Exception e){
e.printStackTrace();
}
}
}
});
只是想指出一切正常,直到我的笔记本电脑坏了,我不得不换一台。
感谢您的帮助。
我认为您的问题与列顺序有关,最重要的是限制 rowid 列的别名,在您的情况下是 Id 列(Id INTEGER PRIMARY KEY AUTOINCREMENT
定义Id作为rowid列的别名).
- 注意其他列可以存储任何值:-
Any column in an SQLite version 3 database, except an INTEGER PRIMARY
KEY column, may be used to store a value of any storage class.
- Datatypes In SQLite Version 3
这样的列只能存储一个整数值。 String sql = "INSERT INTO PHOTO VALUES(NULL,?,?,?,?)";
相当于按照 :-
插入值
- NULL 进入 name 列
- 名称,作为传递,进入 lat 列
- lat,作为传递,进入 lon 列
- lon,如传,进入图片栏
- image, as passed, into the Id column (bye[] cannot be stored in Id column)
您可以解决此问题,方法是提供列名或 re-ordering 列以匹配它们的定义顺序(前者可以说是更好的做法)。
因此,以下任一方法应该可以解决问题:-
String sql = "INSERT INTO PHOTO (Id, name, lat, lon, image) VALUES(NULL,?,?,?,?)";
或 :-
String sql = "INSERT INTO PHOTO VALUES(?,?,?,?,NULL)";
在我的项目中,我使用 sqlite 数据库来保存图片及其位置。我在尝试将数据插入我的数据库时遇到此错误:
E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO PHOTO VALUES(NULL,?,?,?,?)] datatype mismatch
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tomer.finalproject, PID: 18550
android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:786)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:926)
这是我的代码:
在名为 SQLiteOpenHelper 的 class 中的插入方法:
public void insertData(String name, String lat, String lon, byte[] image) {
SQLiteDatabase database = getWritableDatabase();
String sql = "INSERT INTO PHOTO VALUES(NULL,?,?,?,?)";
SQLiteStatement statement = database.compileStatement(sql);
statement.clearBindings();
statement.bindString(1, name);
statement.bindString(2, lat);
statement.bindString(3, lon);
statement.bindBlob(4, image);
statement.executeInsert();
}
我在另一个按钮 'add' 中调用它 activity :
那两行在 onCreate 下
sqLiteHelper=new SQLiteHelper(this,"GalleryDB.sqlite",null,1);
sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS PHOTO (name VARCHAR,lat VARCHAR,lon VARCHAR,image BLOG,Id INTEGER PRIMARY KEY AUTOINCREMENT)");
这是我的添加按钮:
btnadd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
GPStracker g = new GPStracker(getApplicationContext());
Location l = g.getLocation();
if (l != null) {
double lat = l.getLatitude();
double lon = l.getLongitude();
String stLat= String.valueOf(lat);
String stLon= String.valueOf(lon);
try{
Toast.makeText(getApplicationContext(), "Saved To Gallery!", Toast.LENGTH_SHORT).show();
sqLiteHelper.insertData(etname.getText().toString().trim(),stLat.trim(),stLon.trim(),imageViewToByte(imageView));
}
catch (Exception e){
e.printStackTrace();
}
}
}
});
只是想指出一切正常,直到我的笔记本电脑坏了,我不得不换一台。
感谢您的帮助。
我认为您的问题与列顺序有关,最重要的是限制 rowid 列的别名,在您的情况下是 Id 列(Id INTEGER PRIMARY KEY AUTOINCREMENT
定义Id作为rowid列的别名).
- 注意其他列可以存储任何值:-
Any column in an SQLite version 3 database, except an INTEGER PRIMARY KEY column, may be used to store a value of any storage class.
- Datatypes In SQLite Version 3
这样的列只能存储一个整数值。 String sql = "INSERT INTO PHOTO VALUES(NULL,?,?,?,?)";
相当于按照 :-
- NULL 进入 name 列
- 名称,作为传递,进入 lat 列
- lat,作为传递,进入 lon 列
- lon,如传,进入图片栏
- image, as passed, into the Id column (bye[] cannot be stored in Id column)
您可以解决此问题,方法是提供列名或 re-ordering 列以匹配它们的定义顺序(前者可以说是更好的做法)。
因此,以下任一方法应该可以解决问题:-
String sql = "INSERT INTO PHOTO (Id, name, lat, lon, image) VALUES(NULL,?,?,?,?)";
或 :-
String sql = "INSERT INTO PHOTO VALUES(?,?,?,?,NULL)";