java 如何在Android Studio中将图像插入SQLite数据库

ecr0jaav  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(125)

首先我想说的是,我对Android Studio相当陌生,所以这可能是一个关于基本东西的问题。
我目前正在为Android编程一个测验应用程序,我想将所有的问题存储到SQLite数据库中。

SQLiteDatabase gdb = openOrCreateDatabase(gdbName, MODE_PRIVATE, null);
 gdb.execSQL("CREATE TABLE " + gdbTabelle + "(id INTEGER, question TEXT, image INTEGER, rightAnswer TEXT, alreadyAnswered INTEGER)");
gdb.execSQL("INSERT INTO " + gdbTabelle + " VALUES(1, 'When did Germany reunify', R.drawable.wvg, '03.10.1990', '0')");
gdb.close();

正如你所看到的,我认为我可以访问图像,它将显示在应用程序中的问题,通过它的ID(因此我写了R. drawable. wvg,wvg是图像的名称,我想使用。我把它存储在res/drawable文件夹。)当我写

imField.setImageResource(cursor.getInt(2));

所以我试了

imField.setImageResource(2131165395);

(this number是图片的ID,我通过调试得到的),它工作得很完美。因此我想我可以这样处理它:

SQLiteDatabase gdb = openOrCreateDatabase(gdbName, MODE_PRIVATE, null);
 gdb.execSQL("CREATE TABLE " + gdbTabelle + "(id INTEGER, question TEXT, image INTEGER, rightAnswer TEXT, alreadyAnswered INTEGER)");
gdb.execSQL("INSERT INTO " + gdbTabelle + " VALUES(1, 'When did Germany reunify', 2131165395, '03.10.1990', '0')");
gdb.close();

但当我试着

imField.setImageResource(cursor.getInt(2));

(我尝试了带引号和不带引号的方法,两次都失败了,图像没有显示)。
我最后的方法是

int a = cursor.getInt(2);
imField.setImageResource(cursor.getInt(2));

,也没有成功。
那么,有没有一种优雅的方法可以将图像存储在SQLite数据库中呢?

jvlzgdj9

jvlzgdj91#

首先,我建议使用Jetpack Room,它有更好的错误验证,更容易使用。
第二,你有很多问题:
1.您正尝试将图像ID作为字符串而不是整数插入。请改为:

gdb.execSQL("INSERT INTO " + gdbTabelle + " VALUES(1, 'When did Germany reunify', R.drawable.wvg, '03.10.1990', '0')");

插入内容应如下所示:

gdb.execSQL("INSERT INTO " + gdbTabelle + " VALUES(1, 'When did Germany reunify'," + R.drawable.wvg + ", '03.10.1990', '0')");

1.此代码是正确的,应该已经工作:

gdb.execSQL("INSERT INTO " + gdbTabelle + " VALUES(1, 'When did Germany reunify', 2131165395, '03.10.1990', '0')");

但我猜是因为你在调试时用相同的行id和错误的图像资源id写了多行,然后你只读了第一个错误的行。尝试清除设置中的应用数据,或完全重新安装,或使用execSQL删除多余的行,或指定你的id作为主键(这样id将始终是唯一的,并导致行覆盖)。
另外,我建议通过扩展SQLiteOpenHelper创建一个单独的类来处理DB,你可以阅读android文档(https://developer.android.com/training/data-storage/sqlite)。对于阅读列值,最好使用getInt和getColumnIndex,并将列名存储在常量中。这将减少意外错误的机会,并使代码更具可读性。

相关问题