zoukankan      html  css  js  c++  java
  • 在android项目里使用自带的SQLite数据库


    好久没写博客了,因为项目需要,最近在研究android,使用android默认的访问sqlite的方法,访问的是:data/data/你的项目package/database/数据库名称下的数据库,假如要在项目中打包db文件,该怎么弄呢?


    在网上看到一个老外的方法:


    publicclass DataBaseHelper extends SQLiteOpenHelper{



    复制代码

    //The
    Android's default system path of your application database.

    private static String DB_PATH =
    "/data/data/你的项目package/databases/";

    private static String DB_NAME = "数据库名称";

    private SQLiteDatabase
    myDataBase;

    private final Context myContext;


    public DataBaseHelper(Context context)
    {

    super(context, DB_NAME, null, 1);
    this.myContext =
    context;
    }


    public void createDataBase() throws IOException{

    boolean dbExist =
    checkDataBase();

    if(dbExist){
    //do
    nothing - database already exist

    }else{

    //By
    calling this method and empty database will be created into the default system
    path
    //of your application so we are gonna be able to
    overwrite that database with our database.

    this.getReadableDatabase();

    try {

    copyDataBase();

    } catch (IOException e) {

    throw new Error("Error copying
    database");

    }
    }

    }


    private boolean
    checkDataBase(){

    SQLiteDatabase checkDB = null;

    try{
    String myPath = DB_PATH +
    DB_NAME;
    checkDB = SQLiteDatabase.openDatabase(myPath, null,
    SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){

    //database
    does't exist yet.


    }

    if(checkDB != null){

    checkDB.close();

    }

    return checkDB != null ? true : false;
    }


    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;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,
    SQLiteDatabase.OPEN_READONLY);

    }

    @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) {

    }

    // Add your
    public helper methods to access and get content from the
    database.
    // You could return cursors by doing "return
    myDataBase.query(....)" so it'd be easy
    // to you
    to create adapters for your views.


    复制代码

    }




    下面就可以使用 该 类实现数据库的操作了



    复制代码
    DataBaseHelper
    myDbHelper = new DataBaseHelper(null);
    myDbHelper = new DataBaseHelper(this);

    try
    {

    myDbHelper.createDataBase();

    } catch (IOException ioe) {

    throw new Error("Unable to create
    database");

    }

    try
    {

    myDbHelper.openDataBase();

    }catch(SQLException sqle){

    throw sqle;

    复制代码

    }


    实例化该类之后 就能在 data/data/your_project_package/database/
    文件夹下面看到你的sqlite数据库文件了。

  • 相关阅读:
    oracl遇到的问题
    Ubuntu安装pyucharm的专业版本
    android adb logcat详解(三)
    android monkey压力测试(二)
    android adb常用命令(一)
    python *args 与 **kwargs
    python中带有下划线的变量和函数
    如何区分Python package
    Python Importlib.import_module动态导入模块
    python os.path.dirname(__file__)
  • 原文地址:https://www.cnblogs.com/bmate/p/2672108.html
Copyright © 2011-2022 走看看