java-SQLite数据库游标返回错误的资源ID
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-SQLite数据库游标返回错误的资源ID,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3749字,纯文字阅读大概需要6分钟。
内容图文
我正在尝试使用对SQLite数据库中的drawable和String资源的引用,以在片段中显示适当的资源.我有一个用于填充数据库的数据库帮助程序文件,一个用于创建游标(或仅将游标数据获取数组中的数据)的数据库实用程序文件以及一个片段文件.
DatabaseHelper.java
DatabaseHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
private void updateMyDatabase(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion == 1) {
db.execSQL("CREATE TABLE FOOD (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "IMAGE_RESOURCE_ID INTEGER, "
+ "QUOTE INTEGER);");
insertFood(db,"Alcohol", R.drawable.alcohol, R.string.symptom9);
}
private static void insertFood(SQLiteDatabase db, String name, int toxicity, int resourceId, int quote){
ContentValues foodValues = new ContentValues();
foodValues.put("NAME", name);
foodValues.put("TOXICITY", toxicity);
foodValues.put("IMAGE_RESOURCE_ID", resourceId);
foodValues.put("QUOTE", quote);
db.insert("FOOD", null, foodValues);
}
}
在此,R.drawable.alcohol = 2131099733
我正在使用Android Studio,当我将鼠标悬停在要添加到数据库的值上并使用其中一个值显示可绘制对象时,这是正确的可绘制对象,但是当我请求一个游标(或基于游标的数组)时,游标包含的值与数据库中存储的值完全不同,并产生资源未找到错误.
我尝试从helper方法返回一个数据数组,但是这也为drawables和string提供了不正确的整数引用,因此,我从helper方法返回了游标:
DatabaseUtilities.java
//get all of the database data for a particular food given that food's name
public static Cursor getFoodById(Context context, long itemId){
try {
SQLiteOpenHelper DatabaseHelper = new DatabaseHelper(context);
SQLiteDatabase db = DatabaseHelper.getReadableDatabase();
return db.query(DatabaseHelper.FOOD,
new String[]{
DatabaseHelper.NAME, DatabaseHelper.IMAGE_RESOURCE_ID,
DatabaseHelper.QUOTE},
"_id = ?", new String[] {Long.toString(itemId)}, null, null, null
);
} catch (SQLiteException e) {
//TODO Add toast - food not available
return null;
}
}
最后,我尝试在此处显示值:
DetailFragment.java
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Cursor items = DatabaseUtilities.getFoodById(getActivity(), itemId);
if(items.moveToFirst()) {
//set appropriate img
int img = items.getInt(1);
ImageView photo = (ImageView) view.getRootView().findViewById(R.id.detail_photo);
photo.setImageResource(img);
int quote = items.getInt(2);
TextView desc = (TextView) view.getRootView().findViewById(R.id.detail_text);
String descText = getString(quote);
desc.setText(descText);
}
}
这是最后一个文件中所有游标列的日志输出:
DetailFragment - cursor: Alcohol, 2131165269, 2131558463
酒精后的值应为R.drawable.alcohol,2131099733,但光标将改为返回2131165269.可绘制引用之后的字符串引用也是如此.另外,光标为每个插入的行返回不同的值,它们只是错误的值,我不知道它们来自何处,或者是否有办法将它们转换为正确的值.
程序中的所有内容均正常运行,但数据库未返回正确的资源引用.
解决方法:
不要在表中存储资源的整数ID.
每次更改资源并重新编译项目时,它们的值都不能保证相同.
而是将资源ID存储为字符串文字.
因此,将表的定义更改为:
CREATE TABLE FOOD (_id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ "NAME TEXT, "
+ "IMAGE_RESOURCE_ID TEXT, "
+ "QUOTE TEXT);
现在,在字符串IMAGE_RESOURCE_ID和QUOTE中存储字符串ID.
使用游标从表中检索这样的字符串ID时,可以通过以下方式获取其整数ID:
int drawableId = getResources().getIdentifier(drawableString, "drawable", getPackageName());
int stringId = getResources().getIdentifier(stringString, "string", getPackageName());
您可能需要为getResources()和getPackageName()提供有效的上下文,例如:
context.getResources().getIdentifier(drawableString, "drawable", context.getPackageName());
用您从表中为图像和字符串检索的值替换drawableString和stringString.
如果您对表的定义进行了上述建议的更改,则必须从设备/仿真器中卸载应用程序并重新运行,以便删除数据库并使用表的新定义重新创建数据库.
内容总结
以上是互联网集市为您收集整理的java-SQLite数据库游标返回错误的资源ID全部内容,希望文章能够帮你解决java-SQLite数据库游标返回错误的资源ID所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。