Android中的简单数据库访问方法

时间:2013-06-21 11:45:21

标签: android sqlite

我目前正在关注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();。我不想实例化类,打开连接并每次关闭连接 - 但我似乎无法使用静态函数。谁能给我任何想法?

1 个答案:

答案 0 :(得分: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
    }

}

}

Extend your Application class并将您的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();
}
}

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

e.g。在Contact类中,您可以使用“保存”方法从Application类获取数据库,并执行所有必要的命令以保存联系人详细信息。这会将所有数据访问代码保存在与其相关的类中。即修改联系人的所有代码都在您的联系人类别中。

public class contact {

    public void Save() {

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

    }

}

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

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