Android SQLite数据库表示
我有一个关于在Android中处理SQLite数据库的问题 我正在编写一个应用程序,它从SQLite数据库中报告一些数据。 这些应用程序由一个拥有多个片段的活动组成。 这些片段提供了各种工具来绘制和操作数据,并通过接口进行通信 我还需要一个或几个类来表示我的数据库并提供CRUD函数 但是现在我不知道在哪里实现这些类。 每个片段是否都实现了自己的类,还是应该将它们放在活动的中心,并通过接口提供CRUD函数? 我会用界面,但因为我从来没有用安卓做过什么,我不确定Android SQLite数据库表示,android,sqlite,Android,Sqlite,我有一个关于在Android中处理SQLite数据库的问题 我正在编写一个应用程序,它从SQLite数据库中报告一些数据。 这些应用程序由一个拥有多个片段的活动组成。 这些片段提供了各种工具来绘制和操作数据,并通过接口进行通信 我还需要一个或几个类来表示我的数据库并提供CRUD函数 但是现在我不知道在哪里实现这些类。 每个片段是否都实现了自己的类,还是应该将它们放在活动的中心,并通过接口提供CRUD函数? 我会用界面,但因为我从来没有用安卓做过什么,我不确定 对于这种情况,有推荐的方法或模式吗?
对于这种情况,有推荐的方法或模式吗?最好使用活动来处理数据库活动和写/读,并让您的片段与活动进行通信(这是谷歌推荐的)。DBOpenHelper的外观可能如下所示:
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by Dev Paul
*/
public class DataBaseOpenHelper extends SQLiteOpenHelper {
// Logcat tag
private static final String LOG = "DatabaseHelper";
// Database Version
private static final int DATABASE_VERSION = 1;
// Database Name
private static final String DATABASE_NAME = "contactsManager";
//Table Names
public static final String REPS_TABLE = "repsTable";
//Reps Table Columns
public static final String R_COLUMN_ID = "repId";
public static final String R_COLUMN_STRING_DATA = "repStringData";
public static final String R_COLUMN_GOOD_FORM = "repGoodForm";
/**
* Table create statements for the reps objects.
*/
private static final String CREATE_REPS_TABLE = "CREATE TABLE "
+ REPS_TABLE + " (" + R_COLUMN_ID + " INTEGER, "
+ R_COLUMN_STRING_DATA + " TEXT, "
+ R_COLUMN_GOOD_FORM + " INTEGER " + ")";
/**
* Default constructor.
* @param context from the calling activity.
*/
public DataBaseOpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_REPS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//drop the tables if they exist.
db.execSQL("DROP TABLE IF EXISTS " + REPS_TABLE);
// create new tables
onCreate(db);
}
}
这是我正在开发的一个应用程序的一部分,最终可能是开源的。然后你的数据源类看起来像这样
/**
* Created by Dev Paul
*/
public class DataSource {
private Context mContext;
private DataBaseOpenHelper dataBaseOpenHelper;
private SQLiteDatabase db;
private boolean isOpened;
/**
* Class that helps with obtaining data from the data base. This should do all interfacing to
* the data base. No calls should be directly made to {@code DataBaseOpenHelper}.
* @param context the context of the calling activity.
*/
public DataSource(Context context) {
this.mContext = context;
dataBaseOpenHelper = new DataBaseOpenHelper(context);
}
/**
* Checks to see if the database has been openned.
* @return
*/
public boolean isOpened() {
return isOpened;
}
/**
* Get a writeable database. This must be called.
*/
public void open() {
db = dataBaseOpenHelper.getWritableDatabase();
isOpened = true;
}
/**
* Close the database. This must be called.
*/
public void close() {
dataBaseOpenHelper.close();
isOpened = false;
}
//handle getting and creating data methods....
}
然后,您只需要使用具有适当SQL语法的查询语句来处理获取数据的设置。因此,在您的活动中,您只需创建一个新的DataSource对象并调用DataSource.open()来打开数据库。然后在活动的
ondestory()方法中调用dataSource.close(),这样就不会泄漏任何元素 您可以简单地维护SQLiteOpenHelper
的一个单例实例,并在您想要的地方在片段中使用它
对于以数据为中心的应用程序,建议使用单例实例。即使有多个线程在同一个数据库实例上工作,也不需要担心同步问题。由于您有一个SQLiteOpenHelper
的单个实例,因此您在内部维护SQLiteDatabase
对象的单个实例,并且它是线程安全的
您刚才提到了活动中的多个片段(没有提到用于处理数据的线程)。因此,我想补充这方面的内容。
更好地在后台线程上执行以数据为中心的操作。当每个片段对数据进行一些处理时,强烈建议在后台线程中进行,以避免阻塞UI/主线程
为了更好地组织代码,请创建DAO层