0

我对android sqlite数据库不是很熟悉。我对填充 sqlite 数据库只有粗略的了解。我遵循了一些教程,但它们讲述了不同的事情。我有一个 android 项目,其中一个包是 .db 这个包由 5 个不同的类组成。他们是:

  1. 数据适配器.java
  2. 数据库助手.java
  3. DBAdapter.java
  4. LoadDBActivity.java
  5. SelectDBAdapter.java

我知道 SelectDBAdapter 类用于从数据库中选择数据。我的数据库位于 .jpeg 格式的资产文件夹中。我可以从 sqliteBrowser 打开它。实际上,我想知道的是我们为什么要使用这些不同的类?每一堂课的目的是什么?

真的很抱歉,我不能发布代码,因为这个项目属于另一个人(我的朋友)。如果有人能如此友好地解释使用这些不同类的含义以及我们为什么要使用这样的 senario,我将非常感激?

4

2 回答 2

3

根据我的开发经验,我总是喜欢在 /res/raw 文件夹中添加准备好的 sqlite 数据库文件。您使用 Firefox 的 Sqlite Manager 插件创建/管理 sqlite 数据库,这是一个很棒的工具。这个方法真的很棒,因为

  • 首先,我不需要编写一堆代码来创建/管理数据库。
  • 最重要的是,一些应用程序需要从预先填充的数据库中读取。我不需要关心应用程序需要什么以及数据库是空的还是已填满。它服务于所有目的。我只需要编写一些方法来运行所需的简单 sql。

这是我自己定制的 DatabaseHelper 类。要使用此类,您需要遵循一些说明。

  1. 如果 sqlite 数据库大小超过 1MB 则将文件拆分为块,我更喜欢 512KB 块并将它们放入 /res/raw 目录。
  2. 在以下类中编辑包名称和您的 db 文件名。

    package your.packagee.name;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import android.content.Context;
    import android.content.res.Resources;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    import android.widget.Toast;
    
    public class DataBaseHelper extends SQLiteOpenHelper {
    
    private static final String pkg = "your package name";
    private static String DB_PATH = "/data/data/" + pkg + "/databases/";
    
    private static String DB_NAME = "yourDBFile.sqlite";
    int[] dbfiles = { R.raw.chunk1 , R.raw.chunk2 ..... };
    
     private SQLiteDatabase myDataBase;
    private final Context myContext;
    
    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }
    
    public void createDataBase() {
    
        boolean dbExist = checkDataBase();
    
        if (dbExist) {
            // do nothing - database already exist
        } else {
            this.getReadableDatabase();
            try {
                CopyDataBase();
            } catch (IOException e) {
                Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                        .show();
                Log.d("Create DB", e.getMessage());
            }
        }
    
    }
    
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        } catch (SQLiteException e) {
            Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                    .show();
            Log.d("Check DB", e.getMessage());
        }
    
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }
    
    private void CopyDataBase() throws IOException {
        InputStream databaseInput = null;
        Resources resources = myContext.getResources();
        String outFileName = DB_PATH + DB_NAME;
    
        OutputStream databaseOutput = new FileOutputStream(outFileName);
    
        byte[] buffer = new byte[512];
        int length;
    
        for (int i = 0; i < dbfiles.length; i++) {
            databaseInput = resources.openRawResource(dbfiles[i]);
            while ((length = databaseInput.read(buffer)) > 0) {
                databaseOutput.write(buffer, 0, length);
                databaseOutput.flush();
            }
            databaseInput.close();
        }
    
        databaseOutput.flush();
        databaseOutput.close();
    }
    
    public void openDataBase() throws SQLException {
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    }
    
    @Override
    public synchronized void close() {
        if (myDataBase != null)
            myDataBase.close();
        super.close();
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
    
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
    }
    
    public boolean deleteItem (String ID){
    
        String query = "delete from item where id='" + ID + "'"  ;
        Log.d("Query : ", query);
        try{
            myDataBase.execSQL(query);
            return true ;
        } catch (Exception e){
            Log.d("Exception", e.toString());
            return false ;
        }
    }
    
    public Cursor getSearchFromID(String id) {
        return myDataBase.rawQuery("select * from item where id = \"" + id + "\"", null);
    }
    
    public boolean addSave(String type, String data , String time) {
    
        String query = "insert into item (type, data , timestamp) values ('" + type
        + "', '" + data + "', '" + time + "')"; 
    try {
       myDataBase.execSQL(query);
       return true ;
    } catch (Exception e) {
       return false ;
    }
    }
    }
    

这是一些编写为示例的方法,如何使用它。

用法很简单。当您的应用程序启动时,这意味着在您的 Launcher 活动中使用此代码来初始化您的数据库

DataBaseHelper helper = new DataBaseHelper(this);
helper.createDataBase();
helper.openDataBase();
helper.close();

然后只需使用 DatabaseHelper 类中编写的方法。一个样本将是这样的

 String id = "1";
    DataBaseHelper helper = new DataBaseHelper(this);
    helper.openDataBase();
    Cursor c = helper.getSearchFromID(id);
    if(c.getCount() > 0){
        c.moveToFirst();

      while(!c.isAfterLast()){
        // extract your data from cursor
        c.MoveToNext();
      }
    }

希望它能解决您在 Android 中有关 sqlite 数据库的所有问题。至少它为我解决了。谢谢你。

于 2013-10-09T04:41:22.450 回答
0

填充数据库有多种方法。我所做的是insert(ObjectType objectName)在 DBAdapter 类中创建一个。话虽如此,我创建了一个对象类,对于这个例子,我将使用 Authorized Personnel

public class AuthorizedPersonnelClass {

  private String _id;
  private String Last_Name;
  private String Middle_Name;
  private String First_Name;
  private String Store_ID;
  private String Status;
  private String New_Personnel;

      //of course insert your 2 constructors and getter setter methods here
}

在我的 DBAdapter 中,我将创建insert(AuthorizedPersonnelClass authorizedPersonnel)处理数据插入的方法:

public long addPersonnel(AuthorizedPersonnelClass authorizedPersonnel){
    ContentValues values = new ContentValues();

    values.put(AUTHORIZEDPERSONNEL_ID, authorizedPersonnel.get_id());
    values.put(L_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getLast_Name());
    values.put(M_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getMiddle_Name());
    values.put(F_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getFirst_Name());
    values.put(STATUS, authorizedPersonnel.getStatus());
    values.put(STORE_ID, authorizedPersonnel.getStore_ID());
    values.put(NEW, authorizedPersonnel.getNew_Personnel());

    return this.mDB.insert(TABLE_AUTHORIZED_PERSONNEL, null, values);
}

从那里开始,假设我想在我的onCreate()函数或按钮调用中填充条目,我将这样做:

//instantiate a global variable for the DBAdapter
DBAdapter db = new DBAdapter(this);

//then if you want to insert 
db.insert(new AuthorizedPersonnelClass( /*insert variables here*/ ));

当然,这些值可能是硬编码的或用户输入的(只需使用 EditTexts 并提取字符串并在那里使用它们)。

在这里,我使用了这个ContentValues例子,因为它对初学者来说更容易使用,而不是做一个可能会让人困惑的 rawQuery Insert 语句。

于 2013-10-09T04:28:50.770 回答