2014-11-16 55 views
0

我有一个关于在Android中处理SQLite数据库的问题。SQLite数据库表示法

我正在编写一个应用程序,它正在从SQLite数据库中进行一些数据报告。这些应用程序由一个拥有多个碎片的活动组成。这些片段提供了各种工具来绘制和操作数据并通过接口进行通信。

我还需要一个或几个类来表示我的数据库并提供CRUD功能。

但现在我不知道在哪里实现这些类。 每个片段是否都实现了自己的类,还是应该将它们放在我的Activity中,并通过Interfaces提供CRUD功能? 我会用Interfaces来做,但是因为我从来没有用Android做过什么,所以我不确定。

这种情况下是否有推荐的方式或模式?

回答

0

这将是最好的使用活动来处理数据库活动和写/读,只是让你的片段与活动(这是谷歌反正推荐)沟通。你可以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()来打开数据库。然后在您的活动的onDestroy()方法中调用dataSource.close(),以便不泄漏任何元素。

1

您可以简单地维护您的SQLiteOpenHelper的单例实例,并在您想要的任何片段中使用它。

对于以数据为中心的应用程序,建议使用单例实例。即使您有多个线程在同一个数据库实例上工作,您也不必担心同步。由于您有一个单一实例SQLiteOpenHelper,因此您在内部维护单个实例SQLiteDatabase对象,并且它是线程安全的。

您刚才提到了一个活动中的多个片段(未提及用于处理数据的线程)。所以我想补充一点。 更好地在后台线程上执行以数据为中心的操作。当每个片段对数据进行一些处理时 - 强烈建议在后台线程中执行以避免阻塞UI /主线程。

为了更好地组织您的代码,创建一个DAO层。