我目前正在关注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();
。我不想实例化类,打开连接并每次关闭连接 - 但我似乎无法使用静态函数。谁能给我任何想法?
答案 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位于静态字段中,您可以随时随地访问它,并且它已经拥有自己的应用程序类上下文。
请注意,为简单起见,上述内容排除了任何错误处理。