java - 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 专家......
解决方案
您在 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)");
推荐阅读
- javascript - 在 mapStateToProps 之前初始化状态?
- merge - Puppet - 深度合并查找 default_value 并返回 hiera 哈希
- flask - 更改airflow.cfg 后导入身份验证后端失败
- java - After downloading a java file it would not open
- ansible - Ansible systemctl --user 另一个用户
- excel - 如何重新创建工作表并保持参考有效?
- javascript - 未知的编译器选项包括和排除
- install4j - install4j 构建过程中的自定义脚本
- android - 使用 REST API 时出现异常
- javascript - 检索 Pega 8.1 树导航流程中的错误元素