2

我目前正在关注 Android 的 SQLite 访问教程。它向我展示了一个示例“DBAdapter”类,如下所示:

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBAdapter {
static final String KEY_ROWID = "_id";
static final String KEY_NAME = "name";
static final String KEY_EMAIL = "email";
static final String TAG = "DBAdapter";

static final String DATABASE_NAME = "MyDB";
static final String DATABASE_TABLE = "contacts";
static final int DATABASE_VERSION = 1;

static final String DATABASE_CREATE =
        "create table contacts (_id integer primary key autoincrement, "
        + "name text not null, email text not null);";

final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;

public DBAdapter(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper
{
    DatabaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        try
        {
            db.execSQL(DATABASE_CREATE);
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS contacts");
        onCreate(db);
    }
}

//---opens the database---
public DBAdapter open() throws SQLException
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---
public void close()
{
    DBHelper.close();       
}   

//---insert a contact into the database---
public long insertContact(String name, String email)
{
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_NAME,  name);
    initialValues.put(KEY_EMAIL,  email);
    return db.insert(DATABASE_TABLE,  null,  initialValues);
}

//---deletes a particular contact---
public boolean deleteContact(long rowId)
{
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;        
}

//---retrieves all the contacts---
public Cursor getAllContacts()
{
    return db.query(DATABASE_TABLE,  new String[] {KEY_ROWID,  KEY_NAME,  KEY_EMAIL}, null, null, null, null, null);
}

//---retrieves a particular contact---
public Cursor getContact(long rowId) throws SQLException
{
    Cursor mCursor =
            db.query(true,  DATABASE_TABLE,  new String[] {KEY_ROWID,  KEY_NAME,  KEY_EMAIL}, KEY_ROWID + "="
                    + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

//---updates a contact---
public boolean updateContact(long rowId, String name, String email)
{
    ContentValues args = new ContentValues();
    args.put(KEY_NAME,  name);
    args.put(KEY_EMAIL,  email);
    return db.update(DATABASE_TABLE,  args,  KEY_ROWID + "=" + rowId,  null) > 0;
}
}

现在,如果我想使用这个类来插入联系人,我需要编写以下内容:

DBAdapter db = new DBAdapter(this);
db.open();
long id = db.insertContact("name", "email");
db.close();

因为我肯定需要进行大量调用才能访问数据库,所以我宁愿这不那么冗长。我试图创建一个静态类(所以我不必实例化它),但不能,因为 DBAdapter 类期望在上下文中传递(例如;this)。

我想创建一个类,允许我使用一行代码执行数据库操作,例如dbClass.insertContact("name");,或dbClass.getContacts();。我不想每次都实例化类,打开连接并关闭连接 - 但我似乎无法将它与静态函数一起使用。谁能给我任何想法?

4

1 回答 1

2

这种方法对我很有效。

创建一个DataHelper类,该类打开您的数据库并维护对数据库对象的引用并公开数据库。

public class CustomDataHelper {

private static final int DATABASE_VERSION = 30;
public SQLiteDatabase db = null;

public CustomDataHelper() {

    SQLiteOpenHelper o = new MyOpenHelper(CustomApp.app, "MyData.db");
    this.db = o.getWritableDatabase();

}

    // Rest of standard DataHelper class

private class MyOpenHelper extends SQLiteOpenHelper {

    MyOpenHelper(Context context,String DatabaseName) {
        super(context, DatabaseName, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
              // Standard data code here
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
              // Standard data code here
    }

}

}

扩展您的 Application 类并将您的 Data 对象存储为其中的静态字段。修改您的 Android.manifest 以使用您的自定义应用程序类而不是默认类。

public class CustomApp extends Application {

public static CustomDataHelper data; // Access the data class from anywhere

public static CustomApp app; // Access the application context from anywhere

@Override
public void onCreate() {
    super.onCreate();

    app = this;
    data = new CustomDataHelper();
}
}

任何需要数据访问的类都可以引用这个对象并获得对开放数据库的引用。然后,您可以将所有数据访问代码放入与其相关的类中。

例如,在您的联系人类中,您可以有一个“保存”方法,该方法从应用程序类中获取数据库并执行所有必要的命令来保存联系人详细信息。这会将您的所有数据访问代码保留在与其相关的类中。即所有修改联系人的代码都在您的联系人类中。

public class contact {

    public void Save() {

        CustomApp.data.db.execSQL("Your SQL Here");
        // etc

    }

}

由于 DataHelper 位于静态字段中,因此您可以随时随地访问它,并且它已经从应用程序类中获得了自己的上下文。

请注意,为简单起见,上述内容排除了任何错误处理。

于 2013-06-21T12:09:57.113 回答