插入时数据类型不匹配(代码 20)

Tom*_*mer 2 sqlite android insert mismatch android-sqlite

在我的项目中,我使用 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)
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

名为 SQLiteOpenHelper 的类中的插入方法:

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();

}
Run Code Online (Sandbox Code Playgroud)

我在另一个活动的“添加”按钮中调用它:

这两行在 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)");
Run Code Online (Sandbox Code Playgroud)

这是我的添加按钮:

        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();
                    }


                }


                }
        });
Run Code Online (Sandbox Code Playgroud)

只是想指出一切正常,直到我的笔记本电脑坏了,我不得不换另一台。

感谢您的帮助。

Mik*_*keT 5

我认为您的问题在于列顺序,最重要的是限制 rowid 列的别名,在您的情况下是Id列(Id INTEGER PRIMARY KEY AUTOINCREMENTId定义为 rowid 列的别名)。

  • 请注意,其他列可以按照以下方式存储任何值:-

这样的列只能存储一个整数值。String sql = "INSERT INTO PHOTO VALUES(NULL,?,?,?,?)";相当于按以下方式插入值:-

  • NULL 进入名称
  • 名称,通过,进入纬度
  • 经纬度,进入经度
  • lon,通过,进入图像
  • 传递的图像进入 Id 列(bye[]不能存储在 Id 列中

您可以通过提供列名或重新排序列以匹配它们定义的顺序来解决这个问题(前者可以说是更好的做法)。

因此,以下任一方法都可以解决问题:-

String sql = "INSERT INTO PHOTO (Id, name, lat, lon, image) VALUES(NULL,?,?,?,?)";
Run Code Online (Sandbox Code Playgroud)

或者 :-

String sql = "INSERT INTO PHOTO VALUES(?,?,?,?,NULL)";
Run Code Online (Sandbox Code Playgroud)