首页 > 解决方案 > Android上的Sqlite DB列顺序问题

问题描述

我的应用程序有效(从输入中的某些用户数据生成代码和相关条形码),但我想使用 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 专家......

标签: javaandroidsqldatabasesqlite

解决方案


您在 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)");

推荐阅读