Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite数据库表示_Android_Sqlite - Fatal编程技术网

Android SQLite数据库表示

Android SQLite数据库表示,android,sqlite,Android,Sqlite,我有一个关于在Android中处理SQLite数据库的问题 我正在编写一个应用程序,它从SQLite数据库中报告一些数据。 这些应用程序由一个拥有多个片段的活动组成。 这些片段提供了各种工具来绘制和操作数据,并通过接口进行通信 我还需要一个或几个类来表示我的数据库并提供CRUD函数 但是现在我不知道在哪里实现这些类。 每个片段是否都实现了自己的类,还是应该将它们放在活动的中心,并通过接口提供CRUD函数? 我会用界面,但因为我从来没有用安卓做过什么,我不确定 对于这种情况,有推荐的方法或模式吗?

我有一个关于在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层