Android中的简易数据库访问方法
我目前正在学习Android的SQLite访问教程。它向我展示了一个示例“DBAdapter”类,如下所示:Android中的简易数据库访问方法,android,sqlite,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 a
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()代码>。我不想每次都实例化这个类、打开连接和关闭连接,但我似乎无法将其用于静态函数。有人能给我一些建议吗?这个方法对我很有效
创建一个类,该类打开数据库,维护对数据库对象的引用,并公开数据库
公共类CustomDataHelper{
私有静态最终int数据库_版本=30;
公共SQLiteDatabase db=null;
公共CustomDataHelper(){
SQLiteOpenHelper o=新的MyOpenHelper(CustomApp.app,“MyData.db”);
this.db=o.getWritableDatabase();
}
//标准DataHelper类的其余部分
私有类MyOpenHelper扩展了SQLiteOpenHelper{
MyOpenHelper(上下文上下文、字符串数据库名){
super(上下文、数据库名、null、数据库版本);
}
@凌驾
public void onCreate(SQLiteDatabase db){
//这里是标准数据代码
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//这里是标准数据代码
}
}
}
并将数据对象存储为其中的静态字段。修改Android.manifest以使用自定义应用程序类而不是默认应用程序类
公共类CustomApp扩展应用程序{
public static CustomDataHelper data;//从任何位置访问数据类
public static CustomApp;//从任意位置访问应用程序上下文
@凌驾
public void onCreate(){
super.onCreate();
app=这个;
数据=新的CustomDataHelper();
}
}
任何需要数据访问的类都可以引用此对象并获得对开放数据库的引用。然后,可以将所有数据访问代码放在与之相关的类中
e、 g.在Contact类中,您可以使用“Save”方法从应用程序类获取数据库,并执行所有必要的命令来保存联系人详细信息。这会将所有数据访问代码保存在与之相关的类中。i、 e所有修改联系人的代码都在您的联系人类中
公共类联系人{
公共作废保存(){
CustomApp.data.db.execSQL(“您的SQL在此”);
//等
}
}
由于DataHelper位于静态字段中,因此您可以随时从任何位置访问它,并且它已经从应用程序类拥有自己的上下文
请注意,为了简单起见,上面排除了任何错误处理。谢谢您的回答。我现在正在关注它,一旦它成功,我将标记为已接受。我想知道您是否可以快速解释如何修改android清单以指向自定义应用程序类?我是java新手:)我在上面的答案中给出了一个链接。点击“扩展你的应用程序类”哦,我很抱歉!我没有看到链接:D