Android:从 SQLite 数据库加载
Posted
技术标签:
【中文标题】Android:从 SQLite 数据库加载【英文标题】:Android: loading from SQLite Database 【发布时间】:2011-09-27 22:17:37 【问题描述】:所以我仍在构建数据库来支持我的项目。有两种不同的东西需要保存:第一,一些播放器对象的属性值,第二,存储在 java 类中的简单值。
ATM 我的问题在于加载播放器对象的值并将其写入相应类的过程。
现在让我们看一些代码:
接下来你会看到我想用来将值保存在数据库中的方法。 这很好用,但我刚刚意识到我仍在向 contentValues 对象传递一个额外的 'ID' 值,我确实设置了 - 并计划保持这种方式 - 作为自动增量。 任何想法如何相应地工作?
public void savePlayer(Player player[])
for (int i = 0; i <= 3; i++)
playerValues.put("ID", i);
playerValues.put("Name", player[i].getName());
playerValues.put("HP", player[i].getHp());
playerValues.put("Satisfaction", player[i].getsatisfaction());
playerValues.put("Hygiene", player[i].isHygieneInt());
playerValues.put("IsAlive", player[i].isAliveInt());
db.insert("playertable", null, playerValues);
好的,请坚持住,因为这可能看起来有点像意大利面 - 加载方法:
public void loadPlayer()
String[] namecolumn = "Name" ;
String[] intcolumn = "ID, HP, Satisfaction, Hygiene, IsAlive" ;
String[] namesToString = new String[4];
for (int j = 0; j <= 3; j++)
Cursor playerCursorName = db.query("playertable", namecolumn, "ID="
+ j, null, null, null, null);
namesToString = cursorToString(playerCursorName);
Resource.playerArray[j].setName(namesToString[j]);
for (int i = 0; i < 3; i++)
int[] restToInt;
Cursor playerCursorInt = db.query("playertable", intcolumn, "ID="
+ i, null, null, null, null);
restToInt = cursorToInt(playerCursorInt, 4);
Resource.playerArray[i].setHp(restToInt[i]);
Resource.playerArray[i].setsatisfaction(restToInt[i]);
Resource.playerArray[i].setHygieneInt(restToInt[i]);
Resource.playerArray[i].setAliveInt(restToInt[i]);
是的,我知道这看起来很丑,但让我解释一下:
因为有 4 个播放器对象,我计划通过使用 ID 作为标识符来遍历数据库条目,以一次准确地获取一行,并在我想要的 java 类中写入该对象的名称和其他值在我的项目中管理它们。
注意:这里的自动增量问题与保存方法相同
另外,我在调用 loadPlayer 时得到了 CursorIndexOutOfBoundsException,因为 正在请求索引 -1 - 这不是对数据库的操作导致错误的结果吗?
是的,差不多就是这样,如果需要,我会为您提供额外的代码,希望有人可以帮助我
【问题讨论】:
您可能还想发布创建数据库表的代码,以及 cursorToString 和 cursorToInt 代码。 【参考方案1】:您在这里使用光标的方式有点奇怪。
Cursor 的目的是让 SQLite 为您完成获取数据的艰巨工作,而您的工作只是使用游标遍历返回的值。
首先,我将更改此处的查询以询问表中的所有值(并可能设置一些条件来限制您返回的内容),以确保您的光标随后包含您的所有值。
然后,我将使用 while 循环遍历光标的值,(在循环之前使用 cursor.moveToPosition(-1))使用 cursor.moveToNext() 沿光标移动。
有关更多信息,请参阅 API:
http://developer.android.com/reference/android/database/Cursor.html
关于自动增量问题,据我所知,您可以省略 ID 并使用不带该字段的 db.insert() ,数据库将为您提供 ID。
您的加载方法不应该有同样的问题,因为加载时自动递增没有意义,您只需取回数据库中的内容。
【讨论】:
以上是关于Android:从 SQLite 数据库加载的主要内容,如果未能解决你的问题,请参考以下文章
Android:将 sqlite 数据库内容加载到 webview
Android - 将值从 sqlite 数据库加载到数组列表
Android sqlite数据库-如何在滚动结束时显示列表视图添加 "加载更多项目"。
android Fragment - 我需要从 sqlite 检索数据并填充到 recylerview 的方法