Android SQLITE数据库连接ListView中的表

时间:2014-10-23 06:24:01

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

我的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列,然后在每个行视图中生成一个新的请求以获取TorqueRange by是id: _id,serialNumber,TorqueRange._id以及在TorqueRangeTextView中获取_id,min,max,TorqueUnit._id

实现这一目标的最佳方法是什么? 使连接看起来很简单,但之后我的ContentProvider返回了很多我不想每次都需要的列。 在自定义组件视图中发出请求更多地考虑了数据库的结构,但我不知道提出大量请求是否是个好主意。

感谢你的灯光

1 个答案:

答案 0 :(得分:0)

好的@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 +“工具一起使用/“因为我还需要插入一个新的TorqueRange行。

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

或者有不同的选择吗?