【问题标题】:Fetching single value from SQLite in android从android中的SQLite获取单个值
【发布时间】:2012-07-14 01:08:04
【问题描述】:

我现在正在为 Android 开发我的第一个应用程序,我正在使用多个表来获取和插入数据。在开发过程中,发现自己从表中获取数据时只有两列 STATS(_id, stat_name)。我的问题是什么?我有一个包含 10 个按钮的活动,每个按钮都与一个 stat_name 相关联。当用户按下其中一个按钮时,应用程序将“转到”STATS 表以获取正确的_id,然后在STATS._id = GAME_STATS.StatsId 上将此_id 输入到另一个表GAME_STATS(_id, PlayerId (fk), GameId(fk), StatsId(fk)(andmore)),我基本上必须为PlayerId

现在,我正在这样做:

public String getStatId(String statName){
    String statId = "Error";
    Cursor c = mDb.query(STAT_TABLE, new String[] {AbstractDbAdapter.STAT_ID, AbstractDbAdapter.STAT_NAME}, AbstractDbAdapter.STAT_NAME+ " = " +statName, null, null, null, null);
    int count = c.getCount();
    if(count == 1){
        c.moveToFirst();
        statId = c.getString(c.getColumnIndex(AbstractDbAdapter.STAT_ID));
    }
    c.close();
    mDb.close();
    Log.d("FootballApp","StatId =" +statId);
    return statId;      
}

我的问题是,我知道应该只返回一个值,但我仍然必须使用 Cursor 才能这样做。此外,在我看来,编写所有代码只是为了从一张表中获取一个 ID,这看起来既复杂又耗时。我的应用程序中有 9 个表,每次我需要来自不同表的 _id 时,我都必须编写类似的方法,例如,只有名称。

有人可以告诉我是否有更简单的方法可以做到这一点?请 :) 谢谢! :)

【问题讨论】:

    标签: java android sqlite multiple-tables


    【解决方案1】:

    我认为没有比这更简单的了。但是,您可以使该方法更通用,以便您可以重用代码:

    public String getFromDb(String tableName, String select, String selectBy, String selectName){
        String selection = "Error";
        Cursor c = mDb.query(tableName, new String[] {select}, selectBy + "=" + selectName, null, null, null, null);
        if(c.getCount() == 1){
            c.moveToFirst();
            selection = c.getString(c.getColumnIndex(select));
        }
        c.close();
        mDb.close();
        Log.d("FootballApp", select + "=" + selection);
        return id;      
    }
    

    示例用法:

    int statID = getFromDb(STAT_TABLE, AbstractDbAdapter.STAT_ID, AbstractDbAdapter.STAT_NAME, statName);
    

    【讨论】:

    • 要获得更安全的代码,请将 selectBy + "=" + selectName, null 替换为 selectBy + "=?", new String[]{selectName}
    【解决方案2】:

    这很简单,但是如果光标为空,Cursor.moveToFirst() 将返回 false,因此您可以删除 c.getCount() 调用,而直接说 if(c.moveToFirst())。这将为您节省一点打字时间:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-15
      • 2022-01-09
      • 2014-03-22
      • 2023-03-26
      • 2019-10-09
      • 1970-01-01
      • 2014-03-15
      相关资源
      最近更新 更多