Android中访问数据库的常用方法

Android中访问数据库的常用方法,android,android-sqlite,Android,Android Sqlite,我的数据库中有五个表。它们由一个名为DBHelper的类管理,该类扩展了SQLiteOpenHelper类。因此,这个类只关心 数据库创建和版本管理 我不仅需要在一个活动中查询、插入和修改数据,还需要在多个活动中查询、插入和修改数据。我认为在代码中的任何地方执行SQL语句都不是一种好的做法。我考虑了封装,并创建了一个类,该类提供了许多返回或修改数据库中数据的静态方法。现在这节课太长了 组织数据库访问的最佳方式是什么?为所有可能的SQL语句创建一个类?或者我错误地认为整个应用程序中分散的SQL语

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

数据库创建和版本管理

我不仅需要在一个活动中查询、插入和修改数据,还需要在多个活动中查询、插入和修改数据。我认为在代码中的任何地方执行SQL语句都不是一种好的做法。我考虑了封装,并创建了一个类,该类提供了许多返回或修改数据库中数据的静态方法。现在这节课太长了

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


谢谢

您可以将数据访问代码分离为单独的实体特定类,这些类反过来可以使用SQLiteOpenHelper
您还可以为这些实体类和业务逻辑类之间的双向数据通信定义DAO纯数据类

我就是这样做的。。所有的东西都放在一个地方,您只需要使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);
        }

    }

}

使用自定义ContentProvider,但我从来不想与其他应用程序共享数据。我知道,请不要将其导出。此外,当我编写对象时,我认为您需要编写自己的类作为数据模型,例如:公共类MyObjectForMyDB{int id;String field1、int field2等。}谢谢,我会看看您的方法。但是看起来不错!酷,如果有帮助请告诉我:如果你需要帮助。干杯但是所有这些改变数据库的方法都可能是静态的!?所以实际上这和我之前使用的方法差不多:一个类组织数据库访问。为什么它们应该是静态的?我通常扩展应用程序类,并在那里打开我的数据库,然后编写一个静态MyDatabase getDb。。。