【问题标题】:Android SQLITE database join tables in ListViewListView中的Android SQLITE数据库连接表
【发布时间】:2014-12-18 18:46:07
【问题描述】:

我的 sqlite android 数据库中有 3 个表:

ToolTable
---------
_id
serialNumber
TorqueRange._id

TorqueRangeTable
----------------
_id
min
max
TorqueUnit._id

TorqueUnitTable
---------------
id
name
toNmFactor

我需要使用 CursorAdapter 来显示工具的 ListView,但似乎我有多种选择来公开数据:

  • 使用我的 ContentProvider 返回一个包含我需要的所有列的游标:_id、serialNumber、minTorque、maxTorque、torqueUnitName
  • 仅返回 ToolTable 列,然后在每个行视图中发出新请求以通过 is id 获取 TorqueRange: _id,serialNumber,TorqueRange._id 和 TorqueRangeTextView 之后获取 _id,min,max,TorqueUnit._id

完成此任务的最佳方法是什么? 加入似乎很容易,但之后我的 ContentProvider 会返回很多我每次都不需要的列。 在自定义组件视图中发出请求更尊重数据库的结构,但我不知道发出大量请求是否是个好主意。

谢谢你的灯

【问题讨论】:

  • 我会选择第一个选项,虽然我不完全理解您对该选项的问题,但您始终可以在每次使用 ContentProvider 时设置投影列,这样您就不会得到不需要的列.第二个选项较慢,因为您需要执行多个查询(这些查询并不是很快)。

标签: android android-listview android-contentprovider android-cursor


【解决方案1】:

好的@zozelfelfo,我按照你的建议选择第一个选项:

我创建了我的内容提供者和 UriMatcher:

private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final HashMap<String,String> TOOL_PROJECTION_MAP = new HashMap<String,String>();

private static final String TOOL_TABLES = "Tool AS T LEFT JOIN " +
                                          "TorqueRange AS TR ON TR._id = T.TorqueRange_id " +
                                          "TorqueUnit AS TU ON TU._id = TR.TorqueUnit_id";

public static final String KEY_TOOL_ID = "_id";
public static final String KEY_TOOL_SERIAL_NUMBER = "serialNumer";
public static final String KEY_TOOL_MIN_TORQUE = "minTorque";
public static final String KEY_TOOL_MAX_TORQUE = "maxTorque";
public static final String KEY_TOOL_TORQUE_UNIT_NAME = "torqueUnitName";

private static final int TOOLS = 1;
private static final int TOOLS_ID = 2;

static{
  sUriMatcher.add(AUTHORITY,"tools",TOOLS);
  sUriMatcher.add(AUTHORITY,"tools/#",TOOLS_ID);
  TOOL_PROJECTION_MAP.put(KEY_TOOL_ID,"T._id AS T._id");
  TOOL_PROJECTION_MAP.put(KEY_TOOL_SERIAL_NUMBER,"T.serialNumber AS T.serialNumber");
  TOOL_PROJECTION_MAP.put(KEY_TOOL_MIN_TORQUE,"TR.min AS TR.min");
  TOOL_PROJECTION_MAP.put(KEY_TOOL_MAX_TORQUE,"TR.max AS TR.max");
  TOOL_PROJECTION_MAP.put(KEY_TOOL_TORQUE_UNIT_NAME,"TU.name AS TU.name");
}

通过这一行,我可以使用 TorqueRange 数据查询所有工具并将它们显示在 CursorAdapter 中,但是当我需要插入新行时,我不能将 insert(...) 与 "content://"+AUTHORITY+"tools 一起使用/" 因为我还需要插入一个新的 TorqueRange 行。

将我的内容 uri "content://"+AUTHORITY+"tools/" 替换为 content://"+AUTHORITY+"toolsWithTorqueRange/" 以在 CursorAdapter 中查询并使用 "content:// "+AUTHORITY+"tools/" 用于插入 KEYS : (KEY_TOOL_ID,KEY_TOOL_SERIAL_NUMBER,KEY_TOOL_TORQUE_RANGE_ID)?

还是有不同的选择?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多