`

复制assets下的数据库到SD卡

阅读更多

首先使用sqliteadDev(一个windows下图形化sqlite工具)建立一个新数据库。

android中使用sqlite、复制assets下的数据库到SD卡、支持大于1M的文件

如果使用SD卡,需要在AndroidManifest.xml中设置权限

< uses-permission android:name ="android.permission.WRITE_EXTERNAL_STORAGE" ></ uses-permission > < uses-permission android:name ="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" ></ uses-permission >

 

 

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

 

import android.content.Context;

 import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteDatabase.CursorFactory;

import android.database.sqlite.SQLiteException;

import android.database.sqlite.SQLiteOpenHelper;

 

/**

 

 * DBHelper dbHelper = new DBHelper(this);

 * dbHelper.createDataBase();

 * SQLiteDatabase db = dbHelper.getWritableDatabase();

 * Cursor cursor = db.query()

 * db.execSQL(sqlString);

 * 注意:execSQL不支持带;的多条SQL语句,只能一条一条的执行,晕了很久才明白

 * 见execSQL的源码注释 (Multiple statements separated by ;s are not supported.)

 * 将把assets下的数据库文件直接复制到DB_PATH,但数据库文件大小限制在1M以下

 * 如果有超过1M的大文件,则需要先分割为N个小文件,然后使用copyBigDatabase()替换copyDatabase()

 */

public class DBHelper extends SQLiteOpenHelper {

    //用户数据库文件的版本

    private static final int DB_VERSION    = 1;

    //数据库文件目标存放路径为系统默认位置,cn.arthur.examples 是你的包名

    private static String DB_PATH        = "/data/data/cn.fn/databases/";

/*

    //如果你想把数据库文件存放在SD卡的话

    private static String DB_PATH        = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()

                                        + "/arthurcn/drivertest/packfiles/";

*/

    private static String DB_NAME         = "hello.db";

    private static String ASSETS_NAME     = "hello.db";

 

    private SQLiteDatabase myDataBase    = null;

    private final Context myContext;

 

     /** 

      * 如果数据库文件较大,使用FileSplit分割为小于1M的小文件

      * 此例中分割为 hello.db.101    hello.db.102    hello.db.103

      */

    //第一个文件名后缀

    private static final int ASSETS_SUFFIX_BEGIN    = 101;

    //最后一个文件名后缀

    private static final int ASSETS_SUFFIX_END        = 103;

    

    /**

     * 在SQLiteOpenHelper的子类当中,必须有该构造函数

     * @param context    上下文对象

     * @param name        数据库名称

     * @param factory    一般都是null

     * @param version    当前数据库的版本,值必须是整数并且是递增的状态

     */

    public DBHelper(Context context, String name, CursorFactory factory, int version) {

        //必须通过super调用父类当中的构造函数

        super(context, name, null, version);

        this.myContext = context;

    }

    

    public DBHelper(Context context, String name, int version){

        this(context,name,null,version);

    }

 

    public DBHelper(Context context, String name){

        this(context,name,DB_VERSION);

    }

    

    public DBHelper (Context context) {

        this(context, DB_PATH + DB_NAME);

    }

    

    public void createDataBase() throws IOException{

        boolean dbExist = checkDataBase();

        if(dbExist){

            //数据库已存在,do nothing.

        }else{

            //创建数据库

            try {

                File dir = new File(DB_PATH);

                if(!dir.exists()){

                    dir.mkdirs();

                }

                File dbf = new File(DB_PATH + DB_NAME);

                if(dbf.exists()){

                    dbf.delete();

                }

                SQLiteDatabase.openOrCreateDatabase(dbf, null);

                // 复制asseets中的db文件到DB_PATH下

                copyDataBase();

            } catch (IOException e) {

                throw new Error("数据库创建失败");

            }

        }

     }

    

     //检查数据库是否有效

     private boolean checkDataBase(){

         SQLiteDatabase checkDB = null;

         String myPath = DB_PATH + DB_NAME;

         try{            

             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(ASSETS_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();

     }

     

    //复制assets下的大数据库文件时用这个

     private void copyBigDataBase() throws IOException{

         InputStream myInput;

         String outFileName = DB_PATH + DB_NAME;

         OutputStream myOutput = new FileOutputStream(outFileName);

         for (int i = ASSETS_SUFFIX_BEGIN; i < ASSETS_SUFFIX_END+1; i++) {

             myInput = myContext.getAssets().open(ASSETS_NAME + "." + i);

             byte[] buffer = new byte[1024];

             int length;

             while ((length = myInput.read(buffer))>0){

                myOutput.write(buffer, 0, length);

             }

             myOutput.flush();

             myInput.close();

         }

         myOutput.close();

     }

     

     @Override

     public synchronized void close() {

        if(myDataBase != null){

             myDataBase.close();

         }

         super.close();

     }

     

     /**

      * 该函数是在第一次创建的时候执行,

      * 实际上是第一次得到SQLiteDatabase对象的时候才会调用这个方法

      */

    @Override

     public void onCreate(SQLiteDatabase db) {

     }

     

     /**

      * 数据库表结构有变化时采用

      */

     @Override

     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

     }

 

 }

 

转自:http://www.cnblogs.com/som5/archive/2011/01/23/android_sqlite_assets_sdcard.html

分享到:
评论

相关推荐

    android中复制资源文件中的数据库文件到sd卡或内存源码

    在Android开发中,有时我们需要将预置的数据库文件与应用一起发布,并在应用程序首次启动时将其复制到外部存储(如SD卡)或内部存储(内存)中,以便于后续的操作和使用。这样的需求通常出现在那些需要提供初始数据...

    android复制数据库到SD卡打开加载listview

    通过以上步骤,我们完成了从`assets`复制SQLite数据库到SD卡、打开数据库以及将数据库内容加载到ListView显示的过程。同时,还介绍了如何对ListView进行排序。在实际应用中,可能还需要处理更多细节,例如错误处理、...

    android 将assets 下的文件复制到手机内存中

    在Android开发中,有时我们需要将应用内部的资源文件,如配置文件、数据库文件或静态数据等,复制到手机的外部存储(内存或SD卡)以便于应用运行时使用。这个过程通常涉及到Android的文件系统操作和权限管理。下面将...

    Android获取assets文件夹中的数据并写入SD卡示例

    本文示例主要实现了Android获取assets文件夹中的数据并将其写入到SD卡中,该程序实现的步骤主要为:首先读取assets文件夹中的数据库,再将其写入到SD存储卡中。 完整示例代码如下: import java.io.File; import ...

    zip格式的压缩包放在asset中复制到SD卡上并解压

    在Android应用开发中,有时我们需要将预置的资源文件,如图片、数据库等,以压缩包(例如ZIP)的形式存放在应用的`assets`目录下,然后在运行时将其复制到SD卡,并进行解压。这个过程对于节省应用安装包大小、提供...

    数据库拷贝到应用中

    这个过程通常涉及到将预建的数据库文件从应用的assets目录复制到设备的特定位置,如SD卡或者应用的数据目录。下面将详细阐述如何实现这个过程。 首先,SQLite是Android系统内置的一种轻量级数据库,它被广泛用于...

    Android应用程序中使用自己的SQLite数据库

    - 记得在AndroidManifest.xml中添加读写外部存储的权限,如果需要在外部存储(如SD卡)中操作数据库。 总结来说,要在Android应用中使用自己的SQLite数据库,你需要准备符合Android规范的数据库文件,将其放置在...

    Android sd卡读取数据库实例代码

    如果不存在,我们从应用的资源(通常是assets或res/raw文件夹)中复制预置的数据库文件到SD卡。然后,使用`SQLiteOpenHelper`的`openOrCreateDatabase()`方法打开或创建数据库。 4. 使用数据库: 一旦数据库被成功...

    Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法

    在Android应用开发中,有时我们需要将应用程序资源目录`Assets`中的文件复制到外部存储(如SD卡)上,以便在应用运行时访问或提供给用户。`Assets`目录通常用于存放非资源文件,如文本文件、数据库文件或音频文件等...

    Android studio 添加assets文件夹的方法

    2. **复制assets文件到外部存储**:如果你需要将`assets`中的文件复制到外部存储卡,可以使用`FileOutputStream`配合`InputStream`进行操作,确保获取到相应的权限。 3. **加载XML布局文件**:尽管`assets`主要用于...

    android_filesave

    在“android_filesave”中,有一张名为“filesave.png”的图片位于assets目录下,这是我们要保存到SD卡的目标文件。 **2. 文件保存过程** 保存文件的基本步骤包括以下几个部分: - **获取外部存储状态**:首先,...

    Java 底层机制突破

    在实际项目中,我们可能需要导入外部数据库文件,通常来说,外部数据库文件可能放在 SD 卡、res/raw 或者 assets 目录下面。可以写一个 DBManager 的类来管理数据库文件,首先复制数据库文件到“/data/data/包名/...

    Android面试专题课程 - Ricky1

    - **数据库初始化**:外部数据库可存于SD卡、`res/raw`或`assets`目录下。通过DBManager类进行数据库文件的复制和移动,确保其位于`/data/data/包名/databases/`路径下,然后使用`openOrCreateDatabase()`打开。 -...

    Android面试专题课程 - Ricky【虚拟宝库网www.xunibaoku.com】1

    - **导入外部数据库**:外部数据库通常存储在SD卡、res/raw或assets目录下,然后通过复制到`/data/data/包名/databases/`目录并打开。 2. **本地广播(LocalBroadcastManager)**: - **本地广播的作用**:提供应用...

    Android面试突破.pdf

    - 导入外部数据库:外部数据库通常位于SD卡、res/raw或assets目录下。可以通过复制到/data/data/包名/databases/目录并使用`openOrCreateDatabase()`打开。 2. **本地广播与全局广播**: - 本地广播是出于安全...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--文件之释放Assets下的文件到应用的File目录 |--文件之随机存储RandomAccessFile |--文件使用时间排序 |--文件复制粘贴 |--文件路径之通过uri获取 |--时间java常用应用 |--时间之handle记时器 |--时间之time的用法...

    root_explorer汉化版

    用户可以方便地在内部存储、外部SD卡以及网络位置之间管理文件。 3. **权限管理**:Root Explorer允许用户更改文件和文件夹的权限,这对于调试和定制系统非常重要。用户可以设置读写执行权限,甚至可以改变文件的...

    MyManagerFileAndroid文件读写操作(源码)

    Android提供了多种存储方式,包括内部存储、外部存储(SD卡)、SQLite数据库、SharedPreferences和ContentProvider等。内部存储对于应用私有的数据,外部存储则允许共享数据。`MyManagerFileAndroid`可能会涵盖这两...

Global site tag (gtag.js) - Google Analytics