zoukankan      html  css  js  c++  java
  • 在Android程序中使用已有的SQLite数据库

    已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com




        在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的数据库的文章,于是在谷歌上找到这篇英文文章,依照它的步骤,測试成功。决定把这篇文章大致的翻译一下,想看原文的能够点击这里:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ 。这篇文章有700多条评论,所以应该还是经历过比較多的讨论的。在overstackflow的一些解答中,也是直接引用了这篇文章。分享给有须要的同学。


    译文:

        在大多数的Android演示样例或是教程中,都是如果你须要在程序执行的时候创建一个数据库并插入新的数据,而不是使用一个独立的提前读取的数据库。

        这里要讲到的是,如何使用你自己的存储在“assets”目录下的SQLite数据库,即如何将你准备好的数据库拷贝到你Android程序的系统数据库路径下,从而让SQLiteDatabase API可以正常的读取它。

      1. 准备SQLite database文件

        如果你已经创建了一个sqlite数据库,我们须要对其进行一些改动。

       (译者注:这里原文是推荐了一个SQLite数据库管理软件。这个我认为能够随自己的喜好,最Windows以下有多款可视化的SQlite数据库管理软件,能够方便的读取。编辑数据库,比如我用的是sqlitestudio

    打开数据库。加入一个新的table “android_metadata",插入一行数据,详细的SQL例如以下:

    CREATE TABLE "android_metadata" ("locale" TEXT DEFAULT 'en_US')
    
    INSERT INTO "android_metadata" VALUES ('en_US')
       (译者注:上面两行是表明须要进行的操作,详细能够直接在sqlitesstudio中完毕)

        然后你须要对你数据表格的primary id 列重命名为 “_id”。这样Adroid会知道怎么对id列进行绑定,你能够非常easy的在SQlite数据库管理软件中进行列编辑。

        这两步之后,你的sqlite数据库文件就准备好了。

      (译者注:这里我保留了id列,即没有对其进行重命名,測试证明也是没有问题的)


    2. 在你的Android程序中复制,打开以及訪问数据库

        如今把你上一步准备好的数据库文件放在“assets”目录以下。然后通过继承 SQLiteOpenHelper类来创建一个Database Helper类。

    你的DataBaseHelper类大致能够例如以下:

    public class DataBaseHelper extends SQLiteOpenHelper{
     
        //The Android's default system path of your application database.
        private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
     
        private static String DB_NAME = "myDBName";
     
        private SQLiteDatabase myDataBase; 
     
        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{
     
        		//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");
     
            	}
        	}
     
        }
     
        /**
         * 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_READONLY);
     
        	}catch(SQLiteException e){
     
        		//database does't exist yet.
     
        	}
     
        	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;
        	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实例,然后调用createDataBase()。然后再调用openDataBase()方法,记住改动DB_PATH字符串中“YOUR_PACKAGE”为你真正的package名称(也就是说com.examplename.myapp)

    下面是示范代码:

     ...
     
            DataBaseHelper myDbHelper = new DataBaseHelper();
            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;
     
     	}
     
            ...



  • 相关阅读:
    ESP8266 STA TCP 客户端配置并连接通信
    Modbus CRC16 校验计算函数
    自写简易版从机Modbus
    STM32CubeIDE查看内存使用情况
    WPF 样式Style
    WPF选项卡页面分离之Page调用Window类
    WPF 多个选项卡TabControl 页面分离
    STM32Cube IDE 汉字字体变小解决办法
    浮点数double相等性比较
    Ling应用
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7152507.html
Copyright © 2011-2022 走看看