填充SQLite数据库

时间:2013-10-09 04:17:03

标签: java android sqlite

我对android sqlite数据库不是很熟悉。我只是粗略地想到填充sqlite数据库。我已经按照一些教程,但他们讲了不同的东西。 我有一个android项目,其中一个'packeges是.db 这个包由5个不同的类组成。他们是:

  1. DataAdapter.java
  2. DataBaseHelper.java
  3. DBAdapter.java
  4. LoadDBActivity.java
  5. SelectDBAdapter.java
  6. 我知道SelectDBAdapter类用于从数据库中选择数据。我的数据库在资产文件夹中,格式为.jpeg。我可以从sqliteBrowser打开它。 实际上,我想知道的是为什么我们应该使用这些不同的类?每个班级的目的是什么?

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

2 个答案:

答案 0 :(得分:3)

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

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

这是我自己定制的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 ;
    }
    }
    }
    
  3. 以下是一些作为样本编写的方法,如何使用它。

    用法很简单。当您的应用程序启动时,这意味着在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数据库的所有问题。至少它为我解决了。谢谢。

答案 1 :(得分:0)

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

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语句更容易,这可能会让人感到困惑。