2010-05-17 45 views
3

我为我的主Sqlite表创建了一个ContentProvider,几乎跟在SDK的NotePad example之后(虽然我不确定我是否会将我的数据公开给其他应用程序)。但是,我需要在该表和其他表和视图上创建大量其他不重要的查询。一个很好的例子是查询从基础数据,平均数,总计等中提取一些统计数据。如何在Android项目中组织数据库访问代码?

那么在Android项目中,这段代码的最佳位置是什么?它应该如何与提供商公开的基于Uri的数据访问相关联?那里有好的例子吗?

+0

您是否希望将数据库中的数据仅提供给您的应用程序?或者您是否设想可以从其他应用程序访问? – Adam 2010-05-17 15:08:19

+0

只为我。我现在主要关心的是代码的可读性和可维护性。实际上,我想保留现有的ContentProvider,但只为我的应用程序构建其余的DB代码。 – 2010-05-17 15:37:51

回答

3

从点维护能力的观点我认为提供者模型是抽象数据访问代码的最干净的方式。从大型应用程序的工作经验来看,最终应用程序将发展到某些数据必须通过提供者模型公开的地步(例如向应用程序引入服务)。这意味着暴露数据的许多不同视图可能在提供者模型中有很多工作。

如果您要走这条路线,我会仔细考虑如何通过URL公开数据,通常可以使用代表数据的不同视图的子目录来管理您谈论的一些复杂性(类似于一种REST方法)。

如果您希望避免提供者模型,那么实现DA类非常简单。通常,SQLiteOpenHelper被创建为DA类的内部类(打开的帮助程序还提供基本的版本支持),并且此类的实例用于在DA函数中创建数据库连接。 Android源代码中有很多例子。查看任何提供者实现,其中MediaProvider.java可能是最相关的,因为它对提供者使用相当复杂的搜索。例如,从不是内容提供商的源代码,请参阅DbSSLSessionCache.java

+0

谢谢,我想我总是可以在现有DA的基础上构建提供者,因为它是一种附加层。就我个人而言,我看到选择DA over Provider的两个主要原因:提供者模型需要相当多的样板代码,它需要更多的计划,深思熟虑的URI等。我可能错了,但我有点偏颇 - 主要在Ruby中工作。:) – 2010-05-18 12:55:25

+0

是的,我会同意你的结论。但是一些数据结构非常适合提供者模型(例如层级数据) – 2010-05-18 21:37:21

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; 
    } 

} 
+0

这个DA类应该继承/实现什么特定的类或接口?它应该与SQLiteOpenHelper有关吗?它应该如何接收/保存/解析'SQLiteDatabase'实例?我可以看一看吗? – 2010-05-17 16:41:50

+0

我在回答中添加了几段代码示例,这些代码可以帮助您走上正确的道路。有关更多详细信息,请参阅SDK文档。 – 2010-05-17 17:27:17

+0

谢谢。你能写出你初始化属性'localDBRW'的方式和时间吗? – 2010-05-17 17:42:59