2014-11-16 83 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層。