【问题标题】:Sqlite DB column order issue on AndroidAndroid上的Sqlite DB列顺序问题
【发布时间】:2018-07-31 10:22:21
【问题描述】:

我的应用程序可以工作(从输入中的某些用户数据生成代码和相关条形码),但我想使用 sqlite 将数据存储在 Db 中。这是我的 DatabaseOpenHelper 类:

public class DatabaseOpenHelper extends SQLiteOpenHelper {
    public static final String DATABASE_NAME = "cf_db.db";
    public static final String TABLE_NAME = "cf_table";
    public static final String CF = "CF";
    public static final String COL1 = "Name";
    public static final String COL2 = "Surname";
    public static final String COL3 = "Sex";
    public static final String COL4 = "Birthday";
    public static final String COL5 = "PlaceOfBirth";


    public DatabaseOpenHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
        //SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("CREATE TABLE " + TABLE_NAME +
                "(" + CF + "TEXT PRIMARY KEY, " + COL1 + "TEXT NOT NULL, " +
                COL2 + "TEXT NOT NULL," + COL3 + "TEXT NOT NULL," + COL4 +
                "TEXT NOT NULL," + COL5 + "TEXT NOT NULL);");

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(sqLiteDatabase);
    }

    public boolean insertData(String cf, String name, String surname, String sex, String year,
                              String month, String day, String place) {
        String date = day + "/" + month + "/" + year;
        SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(CF, cf);
        contentValues.put(COL1, name);
        contentValues.put(COL2, surname);
        contentValues.put(COL3, sex);
        contentValues.put(COL4, date);
        contentValues.put(COL5, place);
        sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
        sqLiteDatabase.close();

    }
}

最后的插入语句有问题。我收到以下错误:

E/SQLiteLog: (1) table cf_table has no column named Birthday
E/SQLiteDatabase: Error inserting Birthday=22/08/21 CF=GGUTUU21M22I754G Surname= ggu Name=uut Sex=M PlaceOfBirth=Siracusa
                  android.database.sqlite.SQLiteException: table cf_table has no column named Birthday (code 1 SQLITE_ERROR): , while compiling: INSERT INTO cf_table(Birthday,CF,Surname,Name,Sex,PlaceOfBirth) VALUES (?,?,?,?,?,?)
                      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:901)
                      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:512)
                      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                      at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
                      at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1562)
                      at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
                      at com.example.valerio.androidcodesgenerator.DatabaseOpenHelper.insertData(DatabaseOpenHelper.java:53)
                      at com.example.valerio.androidcodesgenerator.MainActivity.AddData(MainActivity.java:136)
                      at com.example.valerio.androidcodesgenerator.MainActivity$1.onClick(MainActivity.java:98)
                      at android.view.View.performClick(View.java:6597)
                      at android.view.View.performClickInternal(View.java:6574)
                      at android.view.View.access$3100(View.java:778)
                      at android.view.View$PerformClick.run(View.java:25883)
                      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:6642)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

这些列的顺序是我不理解的随机顺序,当我使用一些打印语句分析问题时,我意识到各种 contentValues 根本没有任何价值。我刚刚做了

Log.d("code", contentValues.getAsString(cf))

错误就像“println 需要打印一些东西”,所以基本上 contentValues 的 put 语句没有放入任何内容。实际上在错误消息中的值是 (??????).. . 相反,在调用中,打印测试运行良好,并且各种 editText 和 textView 都有其正确的内容。

这是 insertData 调用:

public void AddData() {
    boolean inserted = myDb.insertData(textView_cf.getText().toString(),
        editText_name.getText().toString(),
        editText_surname.getText().toString(),
        editText_sex.getText().toString(),
        editText_aa.getText().toString(),
        editText_mm.getText().toString(),
        editText_gg.getText().toString(),
        autoCompleteTextView_place.getText().toString());
}

(我还需要对插入进行布尔控制,但插入现在不会发生)

也许这是新手的错误,但我只是 Android Studio 的新手,根本不是 Java 专家......

【问题讨论】:

  • 先生,请使用 ("CREATE TABLE" + TABLE_NAME + "(" + CF + "TEXT PRIMARY KEY," + COL1 + "TEXT NOT NULL," + COL2 + "TEXT NOT NULL," + COL3 + "文本非空" + COL4 + "文本非空" + COL5 + "文本非空);");
  • @Valerio 能否将 Table create query 分配给一个字符串并在 logcat 中打印出来
  • 你应该做 Log.d("code", contentValues.getAsString(CF)) 而不是 cf
  • 是的,很抱歉 Log.d 工作,所以 contentValues 工作。
  • 表创建了吗?你能确认一下吗?

标签: java android sql database sqlite


【解决方案1】:

您必须做的一件事是从您测试它的模拟器/设备上卸载该应用程序,然后再次运行它以重新创建数据库。如果它仍然显示有关 Birthday 字段的错误,那么问题出在其他地方。

使用这种插入方法:

public boolean insertData(String cf, String name, String surname, String sex, String year,
                          String month, String day, String place) {
    String date = day + "/" + month + "/" + year;
    SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(CF, cf);
    contentValues.put(COL1, name);
    contentValues.put(COL2, surname);
    contentValues.put(COL3, sex);
    contentValues.put(COL4, date);
    contentValues.put(COL5, place);
    int id = sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
    sqLiteDatabase.close();

    return (id != -1);

}

我不确定这是否能解决问题,但通过方法的签名,它必须返回布尔值。

【讨论】:

  • 谢谢你的工作,也许是一些缓存问题。现在存储没有错误,但是如果我使用 Sqlite 的 DB 浏览器浏览数据,则没有记录。正在寻找一些软件文档,但我找不到原因
  • 如果 insertData 返回 true,则插入行。只需做一个选择语句并在您的应用程序中尝试并输出到日志
  • 完成,数据库工作。我可能看不到 Db Browser 的任何内容,因为虚拟设备没有植根(?)。非常感谢!
【解决方案2】:

您的 CREATE TABLE 语句中缺少空格

sqLiteDatabase.execSQL("CREATE TABLE " + TABLE_NAME + "(" + 
    CF   + " TEXT PRIMARY KEY, " + 
    COL1 + " TEXT NOT NULL, " +
    COL2 + " TEXT NOT NULL, " + 
    COL3 + " TEXT NOT NULL, " +
    COL4 + " TEXT NOT NULL, " + 
    COL5 + " TEXT NOT NULL)");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多