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 的方法

FileNotFoundException SQLite 数据库 Android

Android使用SQLite数据库