使用Android SQLite数据库

时间:2013-11-19 08:56:19

标签: android sqlite

我正在 android 应用程序中使用SQLite数据库。但我对SQLite并不是很熟悉。当我正在阅读一些教程时,我很困惑,因为那里的结构与现在我正在处理的应用程序有些不同。

在一些教程中,提到CRUD操作在名为 DatabaseHelper 的类中实现,而DB部分仅包含此类。它扩展了 SQLiteOpenHelper 类。

但在我的应用程序中有五个类,它们是,

  • DataAdapter
  • DataBaseHelper
  • 将对DBAdapter
  • LoadDBActivity
  • SelectDBAdapter

除了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/";
}

这将有助于我。 谢谢!!!!!

2 个答案:

答案 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();

您应该使用CursorrawQuery和while循环来获取,添加或删除数据库中的数据。 希望它能帮到你!

答案 1 :(得分:0)

在你给出的列表中,似乎(因为名称是免费的)你有3个适配器,一个DatabaseHelper和一个活动。

  • Activity是MVC模式中的Controller。它将处理您的视图以显示有关数据的视图
  • DatabaseHelper正如它的名字一样,帮助您打开数据库。它会为您管理数据库的版本,如果需要,它将在打开之前创建和/或更新它。
  • 适配器是管理列表视图的类。它将包含定义如何显示视图的方法,知道listview中有多少视图,...

在具体案例中,例如,显示书籍清单:

  • 活动会将适配器设置为listview
  • 数据库帮助程序将打开数据库,并在需要时创建和/或更新表和数据
  • 适配器是一个类,您可以在其中获取特定行的书籍,并将书籍的数据设置为每个项目,...