zoukankan      html  css  js  c++  java
  • android导入外部已存在的数据库大于1M的数据库文件方法(转)

    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;
    
    /**
     * 将把assets下的数据库文件直接复制到DB_PATH,但数据库文件大小限制在1M以下
     * 如果有超过1M的大文件,则需要先分割为N个小文件,然后使用copyBigDatabase()替换copyDatabase()
     */
    public class DBManager extends SQLiteOpenHelper {
        // 用户数据库文件的版本
        private static final int DB_VERSION = 1;
        // 数据库文件目标存放路径为系统默认位置,com.rys.lb 是你的包名
        private static String DB_PATH = "/data/data/com.chishacai/";
    
        // 如果你想把数据库文件存放在SD卡的话
        // private static String DB_PATH =
        // android.os.Environment.getExternalStorageDirectory().getAbsolutePath()
        // + "/arthurcn/drivertest/packfiles/";
    
        private static String DB_NAME = "cscpb.db";
        private static String ASSETS_NAME = "cscdb/cscpb.db";
    
        private SQLiteDatabase myDataBase;
        private final Context myContext;
    
        /**
         * 如果数据库文件较大,使用FileSplit分割为小于1M的小文件 此例中分割为 data.db.100 data.db.101
         * data.db.102....
         */
        // 第一个文件名后缀
        private static final int ASSETS_SUFFIX_BEGIN = 0;
        // 最后一个文件名后缀
        private static final int ASSETS_SUFFIX_END = 3;
        
        private static SQLiteDatabase credb ;
    
        /**
         * 在SQLiteOpenHelper的子类当中,必须有该构造函数
         * @param context 上下文对象
         * @param name 数据库名称
         * @param factory 一般都是null
         * @param version 当前数据库的版本,值必须是整数并且是递增的状态
         */
        public DBManager(Context context, String name, CursorFactory factory,
                int version) {
            // 必须通过super调用父类当中的构造函数
            super(context, name, null, version);
            this.myContext = context;
        }
    
        public DBManager(Context context, String name, int version) {
            this(context, name, null, version);
        }
    
        public DBManager(Context context, String name) {
            this(context, name, DB_VERSION);
        }
    
        public DBManager(Context context) {
            this(context, DB_PATH + DB_NAME);
        }
    
        public void createDataBase() throws IOException {
            boolean dbExist = checkDataBase();
            if (dbExist) {
                // 数据库已存在,do nothing.
    
                System.out.println("数据库已经存在");
    
            } 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();
                    }
                    credb = SQLiteDatabase.openOrCreateDatabase(dbf, null);
                    // 复制asseets中的db文件到DB_PATH下
                    // copyDataBase();
                    copyBigDataBase();
                } 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();
                System.out.println("关闭");
            }
            return checkDB != null ? true : false;
        }
    
        public DBManager open1() {
            String myPath = DB_PATH + DB_NAME;
            System.out.println("数据库已经...");
            myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.OPEN_READONLY);
            System.out.println("数据库打开");
            return this;
    
        }
    
        /**
         * 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();
            System.out.println("数据库已经复制");
        }
        
        /**
         * 关闭刚创建的数据库
         */
        public void closedb() {
            if(credb != null) {
                credb.close() ;
                System.out.println("创建的数据库已关闭");
            }
        }
    
        @Override
        public synchronized void close() {
            if (myDataBase != null) {
                myDataBase.close();
                System.out.println("关闭成功1");
            }
            super.close();
            System.out.println("关闭成功2");
        }
    
        /**
         * 该函数是在第一次创建的时候执行, 实际上是第一次得到SQLiteDatabase对象的时候才会调用这个方法
         */
        @Override
        public void onCreate(SQLiteDatabase db) {
        }
    
        /**
         * 数据库表结构有变化时采用
         */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    
        public void open() {
            SQLiteDatabase DataBase = this.openOrCreateDatabase("data.db",
    
            null);
        }
    
        private SQLiteDatabase openOrCreateDatabase(String string, Object object) {
            // TODO Auto-generated method stub
            return null;
        }
    
    }

    改了一点点东西,代码的注释就能看懂。

    1.如果数据库文件大于1M,就用Filesplit工具切割。先去下载这个软件工具
    2.首先把已有的数据库放到assets文件夹下面,如果没有这个文件就先在android项目中建立这个文件夹。
  • 相关阅读:
    HTML 基本知识
    Vue.js 基本内容
    机器学习概述
    9 验证回文串
    c 字符串的一些常用函数
    8 有效的字母异位词
    7 字符串中的第一个唯一字符
    对公平锁、非公平锁、可重入锁、递归锁、自旋锁的理解
    一个解释volatile关键字最好的例子
    Singleton多种实现方式的在多线程情况下的优缺点
  • 原文地址:https://www.cnblogs.com/jinglingJuly/p/3059032.html
Copyright © 2011-2022 走看看