美文网首页
Android使用外部db正确姿势

Android使用外部db正确姿势

作者: Android砖家 | 来源:发表于2019-05-17 15:35 被阅读0次

    在android开发过程中,有时候会自己创建db,也有可能使用外部给的db.

    简单说下自己创建db的步骤:

    1.写一个类继承SQLiteOpenHelper
    2.在onCreate里面实现db.execSQL

    
    public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {
    
        private static String name = "game.db";
        private static Integer version = 1;
        
        public RecordSQLiteOpenHelper(Context context) {
            super(context, name, null, version);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
            //打开数据库,建立了一个叫records的表,里面只有一列name来存储历史记录:
            db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    
        }
    }
    
    

    那使用外部创建好的db怎么使用呢? 当然也还是要用到SQLiteOpenHelper

    public class ProvinceDataHelper extends SQLiteOpenHelper {
        private static final String DATABASE_NAME = "tag.db";
        private static final int DATABASE_VERSION = 1;
    
        /** Create a helper object for the Events database */
        public ProvinceDataHelper(Context ctx) {
            super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
    
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
    
    }
    
    

    这里值得注意的是,使用外部db的时候onCreate方法里面是没有任何操作的。接下实操怎么实现外部使用db


    首先了解下android db 存放在哪里?
    答:/data/data/项目包名/databases/
    如下图

    yhx.png

    了解db默认存在的位置之后就好办事了。既然是使用外部db,肯定就需要把外部的db文件,放在android项目某个位置,再通过文件流的读写方式,将db copy一份到/data/data/项目包名/databases/下。

    步骤:
    1.讲外部xx.db 放到android项目assets目录中。


    yhx.png

    2.通过文件流的读写方式写入/data/data/项目包名/databases/下。

    
    package com.app.yhx.db;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    /**
     * author : yihuangxing
     * date   : 2019/5/17  14:28
     * desc   :
     */
    public class DatabaseUtil {
        @SuppressLint("SdCardPath")
        public static void packDataBase(Context context){
            //com.app.yhx.db 是程序的包名,请根据自己的程序调整
            // /data/data/com.app.yhx.db/databases目录是准备放 SQLite 数据库的地方,也是 Android 程序默认的数据库存储目录
            // 数据库名为 tag.db
            String DB_PATH = "/data/data/com.app.yhx.db/databases/";
            String DB_NAME = "tag.db";
    
            // 检查 SQLite 数据库文件是否存在
            if (!(new File(DB_PATH + DB_NAME)).exists()) {
                // 如 SQLite 数据库文件不存在,再检查一下 database 目录是否存在
                File f = new File(DB_PATH);
                // 如 database 目录不存在,新建该目录
                if (!f.exists()) {
                    f.mkdir();
                }
    
                try {
                    // 得到 assets 目录下我们实现准备好的 SQLite 数据库作为输入流
                    InputStream is = context.getAssets().open(DB_NAME);
                    // 输出流,在指定路径下生成db文件
                    OutputStream os = new FileOutputStream(DB_PATH + DB_NAME);
    
                    // 文件写入
                    byte[] buffer = new byte[1024];
                    int length;
                    while ((length = is.read(buffer)) > 0) {
                        os.write(buffer, 0, length);
                    }
    
                    // 关闭文件流
                    os.flush();
                    os.close();
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    
    
    

    3.自定义SQLiteOpenHelper类。(记住这是外部数据库,所以不要在onCreate()做任何操作,上面已经说明了)

    
    package com.app.yhx.db;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    
    /**
     * author : yihuangxing
     * date   : 2019/5/17  14:31
     * desc   :
     */
    public class ProvinceDataHelper extends SQLiteOpenHelper {
        private static final String DATABASE_NAME = "tag.db";
        private static final int DATABASE_VERSION = 1;
    
        /** Create a helper object for the Events database */
        public ProvinceDataHelper(Context ctx) {
            super(ctx, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
          //空实现,不要做操作
    
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
    
    }
    
    
    

    4.基本的增删改查。

    
    package com.app.yhx.db;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * author : yihuangxing
     * date   : 2019/5/17  14:32
     * desc   :
     */
    public class DbDao {
    
        private ProvinceDataHelper helper;
        private SQLiteDatabase db = null;
    
        public DbDao(Context mContext) {
            helper = new ProvinceDataHelper(mContext);
        }
    
    
        public List<String> queryData(){
            List<String> proList = new ArrayList<String>();
            try{
                db = helper.getReadableDatabase();
                 //注意表为"WatchingContentHistory"? 怎么知道表名为"WatchingContentHistory",答:android 可视化工具
                Cursor cursor = db.rawQuery("select * from WatchingContentHistory", null);
                if(null != cursor){
                    while(cursor.moveToNext()){
                        String name = cursor.getString(cursor.getColumnIndex("title"));
                        proList.add(name);
                    }
                }
                cursor.close();
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                if(null != db){
                    db.close();
                }
            }
            return proList;
        }
    
    }
    
    
    

    结果:

    public class MainActivity extends AppCompatActivity {
        private TextView mTextview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mTextview = findViewById(R.id.Textview);
            //第一步:copy数据库
            DatabaseUtil.packDataBase(this);
            //第二步:查询数据库
            DbDao dbDao = new DbDao(this);
            if (dbDao.queryData().size() > 0) {
                mTextview.setText(dbDao.queryData().get(0));
            }
        }
    }
    
    

    查询之后的结果,没毛病

    yhx.png

    到此:简单的使用外部db就美滋滋完成了。

    相关文章

      网友评论

          本文标题:Android使用外部db正确姿势

          本文链接:https://www.haomeiwen.com/subject/ishoaqtx.html