代码之家  ›  专栏  ›  技术社区  ›  Mladen Jablanović

在Android项目中如何组织数据库访问代码?

  •  3
  • Mladen Jablanović  · 技术社区  · 14 年前

    NotePad example 来自SDK(尽管我不确定是否会将我的数据暴露给其他应用程序)。但是,我需要在该表和其他表和视图上创建许多其他的、非常重要的查询。一个很好的例子是从基础数据、平均数、总数等中提取一些统计数据的查询。

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

    2 回复  |  直到 14 年前
        1
  •  3
  •   Nic Strong    14 年前

    从可维护性的角度来看,我认为提供者模型是抽象数据访问代码的最干净的方法。从在大型应用程序上工作的经验来看,最终应用程序将增长到必须通过提供者模型公开某些数据的程度(例如,向应用程序引入服务)。也就是说,在提供者模型中,公开数据的许多不同视图可能是一项繁重的工作。

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

    如果您希望避免使用提供者模型,那么实现DA类就相当简单了。通常,SQLiteOpenHelper被创建为DA类的内部类(openhelper还提供基本的版本控制支持),这个类的一个实例被用来在DA函数中创建数据库连接。 MediaProvider.java 可能是最相关的,因为它使用相当复杂的搜索提供程序。例如,从不是内容提供者的源代码中可以看到 DbSSLSessionCache.java

        2
  •  1
  •   Brad Hein    14 年前

    我建议编写一个类,其唯一任务是更新/查询数据库。然后,您可以从其他类/活动实例化这个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;
        }
    
    }