sqlite数据库有时会以错误的顺序插入数据

我正在使用android studio,需要将一些数据插入数据库中。有时,它可以工作,但有时,我会收到此错误。我真的无法弄清楚工作时间与无效时间之间的区别。

CHECK_MASTER=...
VAR=$($CHECK_MASTER 2>&1)

我的数据库助手类中的相关代码如下:

2019-11-09 11:38:34.912 4369-4369/com.example.android.fresh 
D/DatabaseHelper: addData: Adding John Smith to people_table
2019-11-09 11:38:34.913 4369-4369/com.example.android.fresh E/SQLiteLog: 
(20) statement aborts at 5: [INSERT INTO 
people_table(name,amount,contact_no) VALUES (?,?,?)] datatype mismatch
2019-11-09 11:38:34.916 4369-4369/com.example.android.fresh 
E/SQLiteDatabase: Error inserting name=John Smith amount=255.0 contact_no= 1234567890 from {P:4369;U:10178}
android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20 SQLITE_MISMATCH)
    at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
    at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
    at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
    at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
    at android.database.sqlite.SQLiteDatabase.insertWithOnconflict(SQLiteDatabase.java:1613)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1482)
    at com.example.android.fresh.DatabaseHelper.addData(DatabaseHelper.java:51)
    at com.example.android.fresh.createPerson.AddData(createPerson.java:94)
    at com.example.android.fresh.createPerson$1.onClick(createPerson.java:58)
    at android.view.View.performClick(View.java:6669)
    at android.view.View.performClickinternal(View.java:6638)
    at android.view.View.access$3100(View.java:789)
    at android.view.View$PerformClick.run(View.java:26145)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.activityThread.main(activityThread.java:6898)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

这是createPerson类中的代码:

private static final String COL1 = "contact_no";
private static final String COL2 = "name";
private static final String COL3 = "amount";

@Override
public void onCreate(SQLiteDatabase db) {
String createtable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,"
            + COL1 + " TEXT NOT NULL," +
            COL2 + " TEXT NOT NULL,"
            + COL3 + " REAL)" ;
    db.execSQL(createtable);

public boolean addData(String contactNo,String contactName,double amount) {
    SQLiteDatabase db = this.getwritabledatabase();
    Contentvalues contentvalues = new Contentvalues();
    contentvalues.put(COL1,contactNo);
    contentvalues.put(COL2,contactName);
    contentvalues.put(COL3,amount);

    Log.d(TAG,"addData: Adding " + contactName + " to " + TABLE_NAME);

    long result = db.insert(TABLE_NAME,null,contentvalues);

    if (result == -1) {
        return false;
    } else {
        return true;
    }
}

这是方法调用语句:

public void AddData(String contactNo,double amount) {
    boolean insertData = mDatabaseHelper.addData(contactNo,contactName,amount);

    if (insertData) {
        check =1;
        toastMessage("Contact Inserted");
    } else {
        toastMessage("Something went wrong");
    }
}

这些中的每一个都按contactNumber,contactName和amount的顺序排列,但是我遇到的sqlite错误是按contactName,amount和contactNumber的顺序插入它。我真的不明白这是怎么回事。

guyuetie 回答:sqlite数据库有时会以错误的顺序插入数据

由于SQLite能够在任何类型的列中存储任何类型的数据(只有1个例外,因此原因/问题),因此只有一种情况会导致数据类型不匹配。

  • 您希望阅读Datatypes In SQLite Version 3,因为这解释了类型以及与典型数据库相比如何灵活。它还说明了rowid的别名和AUTOINCREMENT。

该列异常是rowid列的别名。通过使用INTEGER PRIMARY KEY(特别是INTEGER不是INT或没有其他任何会导致派生的INTEGER类型的值)来定义rowid列的别名。

  • 请注意,可以将AUTOINCREMENT添加到(并且只能添加到)定义,尽管这样做效率不高,并且很少需要。

rowid及其别名必须包含一个整数值(最多64位带符号)。

因此,您正以某种方式尝试将非整数值插入rowid的别名中,如果使用所示的SQL创建表,则情况并非如此。

因此,SQL尚未成功运行并创建表,但是很可能的原因是存在使用不同SQL创建的先前表。

仅更改创建SQL不会导致表被更改。这是因为数据库在两次运行之间保持不变(停留在那里)。这样, onCreate 方法将在数据库的生存期内仅自动运行一次。

如果更改架构(创建SQL),则必须找到某种运行SQL的方法(这将涉及删除表)。开发App时,最简单的方法是

  1. 删除应用程序的数据,
  2. 卸载该应用程序或
  3. 增加版本号
    1. 仅当onUpgrade删除表以便可以重新创建它们并调用更改的SQL(通常通过调用onCreate)时,后一种选项才起作用。

完成上述操作之一后,应重新运行该应用程序。

  • 请注意,以上选项都将导致当前数据丢失。如果需要保留当前数据,则过程将更加复杂,并且可能需要使用ALTER语句来重命名表,以及将数据从原始表复制(插入)到新表的语句。
,

@MikeT已经详细地正确回答了这个问题,但是我仍然想知道:为什么不遵循建筑设计模式并实现Android Room? 使用Room,您不必担心这种“低级”错误。它会告诉您什么地方出了问题,这就是它的目的所在。 提示:让Room为您执行插入操作,并对持久性数据感到满意

本文链接:https://www.f2er.com/3133831.html

大家都在问