我已经为我的主Sqlite表创建了一个ContentProvider,几乎跟随SDK的NotePad example(虽然我不确定我是否会将我的数据暴露给其他应用程序)。但是,我需要在该表以及其他表和视图上创建许多其他非平凡的查询。一个很好的例子是查询从基础数据,平均值,总数等中提取一些统计数据。
那么Android项目中此代码的最佳位置是什么?它应该如何与提供商公开的基于Uri的数据访问相关联?有什么好的例子吗?
答案 0 :(得分:3)
从维护的角度来看,我认为提供者模型是抽象数据访问代码的最简洁方法。根据在大型应用程序上工作的经验,最终应用程序将发展到必须通过提供程序模型公开某些数据的程度(例如,向应用程序引入服务)。也就是说,在提供者模型中公开许多不同的数据视图可能是很多工作。
如果您要走这条路线,我会仔细考虑如何通过URL公开数据,通常可以使用代表不同数据视图的子目录来管理您所谈到的一些复杂性(类似于REST方法)。
如果您希望避免提供者模型,那么实现DA类是相当简单的。通常,SQLiteOpenHelper被创建为DA类的内部类(open帮助程序也提供基本版本控制支持),此类的实例用于在DA函数中创建数据库连接。 Android源代码中有很多示例。查看任何提供程序实现,MediaProvider.java可能是最相关的,因为它使用非常复杂的提供程序搜索。例如,来自非内容提供商的源代码请参阅DbSSLSessionCache.java
答案 1 :(得分:1)
如果您的应用刚刚访问了您的数据,那么我建议您完全跳过内容提供商。原因是,它会在您的应用和数据库之间添加不必要的层,这将无助于提高性能。
我建议编写一个类,其唯一的工作是更新/查询数据库。然后,从您的其他类/活动中,您可以实例化此DB访问类以获取数据或放置数据。
您可以同时运行数据库类的多个实例。
编辑: 示例代码片段(我从我的工作代码中获取了类定义和几个方法)这是我的第一个应用程序,所以它不完美,但它可以工作:
public class VoyagerDB extends SQLiteOpenHelper {
@Override
public void onCreate(SQLiteDatabase db) {
boolean ret = false;
// build out the schema
ret = populateSchema(db);
}
/**
* Returns information from a given obdRequest record.
* @param requestID
* @return
*/
public Cursor getRequestInfo (String requestID) {
Cursor c = null;
String sql = "SELECT id _id, active,request,formula, description,frequency,minValue,maxValue,numDataBytes " +
"FROM obdRequest " +
"WHERE ID=" + requestID;
c = localDBRW.rawQuery(sql, null);
return c;
}
/**
* If the given settings key exists in the DB, return its record ID. Otherwise return blank.
* @param key
* @return
*/
public String settingsKeyExists (String key) {
String recordID = "";
Cursor c = null;
String sql = "SELECT id,key,value from settings WHERE key = ?";
String selectionArgs[] = {key};
c = localDBRW.rawQuery(sql, selectionArgs);
if (c == null) {
return "";
}
if (c.getCount()<1) {
c.close();
return "";
}
c.moveToFirst();
recordID = c.getString(c.getColumnIndex("id"));
c.close();
return recordID;
}
}