【问题标题】:Common way to access database in AndroidAndroid中访问数据库的常用方法
【发布时间】:2017-10-04 23:28:49
【问题描述】:

我的数据库中有五个表。它们由一个名为 DBHelper 的类管理,该类扩展了 SQLiteOpenHelper 类。因此这个类只关心

数据库创建和版本管理

(http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html)。

我不仅需要在一项活动中查询、插入和修改数据,还需要在多项活动中查询、插入和修改数据。我认为在代码中随处执行 SQL 语句不是一个好习惯。我虽然关于封装并创建了一个类,它提供了许多返回或修改数据库中数据的静态方法。到目前为止,这节课已经太长了。

组织数据库访问的最佳方式是什么?一类适用于所有可能的 SQL 语句?还是我误以为整个应用程序中分散的 SQL 语句并不代表良好的编码风格?

谢谢

【问题讨论】:

  • 使用自定义 ContentProvider
  • 但我从不想与其他应用程序共享数据。
  • 我知道了,那就不要导出了

标签: android android-sqlite


【解决方案1】:

您可以将数据访问代码分成单独的实体特定类,而这些类又可以使用 SQLiteOpenHelper 您还可以为这些实体类和业务逻辑类之间的双向数据通信定义 DAO(仅数据类)

【讨论】:

    【解决方案2】:

    我就是这样做的.. 一切都在一个地方,您只需创建 MyDatabase 对象并从代码中调用您想要的任何方法。 请务必阅读有关更新、插入和删除(特殊包装查询)的信息。您还可以执行原始 sql 语句。希望我没有混淆 ;)

    public class MyDatabase {
    
        public static final String DB_NAME = "myname.db";
        public static final int DB_VERSION = 1;
        public static final String MY_TABLE = "my_table";
    
        public static final String E_IDD = "idd";
        public static final String E_FIELD1 = "f1";
        public static final String E_FIELD2 = "f3";
        public static final String E_FIELD3 = "f3";
    
        Context context;
        MyDbHelper dbHelper;
        SQLiteDatabase db;
    
        public MyDatabase(Context context) {
            this.context = context;
            dbHelper = new MyDbHelper();
        }
    
    
        public void insertSomeObject(Object obj) {
    
            db = dbHelper.getWritableDatabase();
    
            ContentValues values = new ContentValues();
    
            values.put(E_IDD, obj.getId());
            values.put(E_FIELD1, goal.getField1());
            values.put(E_FIELD2, goal.getField2());
            values.put(E_FIELD3, goal.getField3());
    
    
            db.insertWithOnConflict(MY_TABLE, null, values,
                    SQLiteDatabase.CONFLICT_IGNORE);
        }
    
        public void deleteObject(int id) {
            db = dbHelper.getWritableDatabase();
            db.delete(MY_TABLE, E_IDD + "=?",new String[] {""+id });
        }
    
        public Object fromCursor(Cursor c) {
    //carefull here to match the exact types you need for your object
            Object obj = new Object(c.getInt(0), c.getInt(1), c.getString(2), c.getInt(3))
    
            return obj;
        }
    
        public ArrayList<Object> query() {
            ArrayList<Object> objArray = new ArrayList<Object>();
    
            db = dbHelper.getReadableDatabase();
    
            Cursor cursor = db.query(MY_TABLE, null, null, null, null, null,
                    null);
    
            if (cursor.getCount() <= 0)
                return null;
    
            cursor.moveToFirst();
            goalArray.add(fromCursor(cursor));
            while (cursor.moveToNext()) {
                objArray.add(fromCursor(cursor));
            }
            return objArray;
        }
    
        class MyDbHelper extends SQLiteOpenHelper {
    
            public MyDbHelper() {
                super(context, DB_NAME, null,
                        DB_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                String sql = String.format("create table %s "
                                + "(%s int primary key, " + "%s int, " + "%s text, "
                                + "%s int)",
                        MY_TABLE, E_IDD, E_FIELD1, E_FIELD2, E_FIELD3);
                db.execSQL(sql);
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                db.execSQL("drop if exist " + MY_TABLE);
                //or do something smarter 
                onCreate(db);
            }
    
        }
    
    }
    

    【讨论】:

    • 另外,当我在写对象时,我认为你需要编写自己的类作为数据模型,例如:public class MyObjectForMyDB{ int id;字符串字段1,整数字段2等...}
    • 谢谢,我会看看你的方法。不过看起来不错!
    • 酷,如果有帮助,请告诉我 :) 如果您需要任何帮助。干杯!
    • 但是所有这些应该改变数据库的方法都可能是静态的!?所以实际上它与我之前使用的方法几乎相同:一个组织数据库访问的类。
    • 为什么它们应该是静态的?我通常扩展 Application 类,并在那里打开我的数据库,并编写一个静态 MyDatabase getDb()...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 2020-09-23
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多