我正在 android 应用程序中使用SQLite数据库。但我对SQLite并不是很熟悉。当我正在阅读一些教程时,我很困惑,因为那里的结构与现在我正在处理的应用程序有些不同。
在一些教程中,提到CRUD操作在名为 DatabaseHelper 的类中实现,而DB部分仅包含此类。它扩展了 SQLiteOpenHelper 类。
但在我的应用程序中有五个类,它们是,
除了LoadDBActivity之外,所有其他人都扩展了 SQLiteOpenHelper 类。 LoadDBActivity 扩展活动。
所以我现在对这两种方法非常困惑。这是一个标准结构或其他什么。如果有人能帮我解决这个问题,我会非常感激。
在我的项目中, DataAdapter 类就是这样开始的。
public class DataAdapter extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/aaa.v4.controller/databases/";
private static final String DB_NAME = "aaa.db";
private SQLiteDatabase myDataBase;
private final Context myContext;
private static DataAdapter mDBConnection;
private DataAdapter(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
DB_PATH = "/data/data/"+ context.getApplicationContext().getPackageName()+ "/databases/";
}
这将有助于我。 谢谢!!!!!
答案 0 :(得分:1)
我在不同的应用程序中使用过SQLite DB,我的方法是:
我使用Mozilla扩展SQLite Manager
创建数据库,将.sqlite保存在应用程序资产文件夹中。
然后我写了课DatabaseHelper
public class DataBaseHelper extends SQLiteOpenHelper{
private static String DB_PATH = "/data/data/your.package.name/databases/";
private static String DB_NAME = "/*name of your sqlite file, ex Contacts.sqlite*/";
private SQLiteDatabase LuckyDB;//name of your DB
private final Context myContext;
/**
* Constructor
* Takes and keeps a reference of the passed context in order to access to the application assets and resources.
* @param context
*/
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
}
/**
* Creates a empty database on the system and rewrites it with your own database.
* */
public void createDataBase() throws IOException{
boolean dbExist = checkDataBase();
if(dbExist){
//do nothing - database already exist
}else{
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
/**
* Check if the database already exist to avoid re-copying the file each time you open the application.
* @return true if it exists, false if it doesn't
*/
private boolean checkDataBase(){
SQLiteDatabase checkDB = null;
try{
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}catch(SQLiteException e){
}
if(checkDB != null){
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just created empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
private void copyDataBase() throws IOException{
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void openDataBase() throws SQLException{
//Open the database
String myPath = DB_PATH + DB_NAME;
LuckyDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if(LuckyDB != null)
LuckyDB.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
/** Crea (se necessario) il database e restituisce l'oggetto database **/
public SQLiteDatabase getDb()
{
try {
this.createDataBase();
} catch (IOException ioe) {
throw new Error("Unable to create database");
}
try {
this.openDataBase();
}catch(SQLException sqle){
throw sqle;
}
return LuckyDB;
}
}
当您需要使用它时,您可以这样做:
DataBaseHelper myDbHelper = new DataBaseHelper(getApplicationContext());
SQLiteDatabase db = myDbHelper.getDb();
您应该使用Cursor
,rawQuery
和while循环来获取,添加或删除数据库中的数据。
希望它能帮到你!
答案 1 :(得分:0)
在你给出的列表中,似乎(因为名称是免费的)你有3个适配器,一个DatabaseHelper和一个活动。
在具体案例中,例如,显示书籍清单: