android导入外部数据库到项目中的使用方法

最近的一个项目,需要用到很多数据,所以想的是用数据库的形式进行存储,  虽然安卓中自带的有创建数据库,表的操作,但是因为要插入的数据太多,  太麻烦,所以还是希望用可视化的软件进行制作,然后再导入到项目中.  因此我就用了SQliteStudio进行操作的.接下来我就讲讲如何解决我  在这之中遇到的坑.

首先用SQliteStudio写好数据库之后,直接去你创建的文件夹去拷贝你创建的数据库,切记千万不要用软件导出来(因为导出来会选择一个格式,但是并没有发现db,所以导出来后就不是数据库了), 因为我就是导出来发现再用软件打开时打开不了,最好就直接拷贝出来. 这是我遇到的第一个坑.

接下来我拷贝的数据库,拷贝到资源目录(assets)下,然后就把数据库写到文件中(这里我写到了sd卡中,也可以写到/data/data/包名/databases/),我在网上搜了很多,但发现有很多都用不了,最后就自己取他们的有用的代码拼接加上自己写了一些.接下来我来贴下我自己的代码:

首先是SQLiteOpenHelper类
public class BookSqliteOpenHelper extends SQLiteOpenHelper {    public BookSqliteOpenHelper(Context context) {        super(context, "book.db", null, 1);        this.myContext = context;    }    private Context myContext;    //The Android's default system path of your application database.    private String DB_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + "/booksql/";    private static String DB_NAME = "book.db";    private static String ASSETS_NAME = "book.db";    private SQLiteDatabase myDataBase = null;    public void createDataBase() throws IOException {        boolean dbExist = checkDataBase();        if (!dbExist) {            try {                File dir = new File(DB_PATH);                if (!dir.exists()) {                    dir.mkdir();                }                File dbf = new File(DB_PATH + DB_NAME);                if (dbf.exists()) {                    dbf.delete();                }                SQLiteDatabase.openOrCreateDatabase(dbf, null);                copyDataBase();            } catch (IOException e) {                throw new Error("数据库创建失败");            }        }    }    private void copyDataBase() throws IOException {        InputStream myInput = null;//        try {            myInput = myContext.getAssets().open(ASSETS_NAME);            String outFileName = DB_PATH + DB_NAME;            OutputStream myOutput = new FileOutputStream(outFileName);            byte[] buffer = new byte[1024];            int length;            while ((length = myInput.read(buffer)) > 0) {                myOutput.write(buffer, 0, length);            }            myOutput.flush();            myOutput.close();            myInput.close();//        } catch (IOException e) {//            e.printStackTrace();//        }    }    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;    }    @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) {    }}
然后是Activity中的代码,因为这只是一个demo所以没有放在子线程中进行,希望大家注意. 这里第二个坑就是在获取SQLiteDatabase 的对象时必须要用SQLiteDatabase.openDatabase()或者SQLiteDatabase中其它几个方法,这样才可以对自己写出的文件进行查询.
public class MainActivity extends AppCompatActivity {    private String DB_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + "/booksql/";    private static String DB_NAME = "book.db";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        BookSqliteOpenHelper helper = new BookSqliteOpenHelper(this);            try {                helper.createDataBase();            } catch (IOException e) {                e.printStackTrace();            }        SQLiteDatabase database = SQLiteDatabase.openDatabase(DB_PATH+DB_NAME,null,SQLiteDatabase.OPEN_READWRITE);        Cursor cursor = database.query("book", null, null, null, null, null, null, null);        while (cursor.moveToNext()){            String bookname = cursor.getString(cursor.getColumnIndex("bookname"));            Log.i("11111111111111111",bookname);        }    }}
最后一个就是权限问题了
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

根据下面网友提供的建议 在进行检查数据库存在时还可以用下面方法进行检测

private boolean checkDataBase() {String myPath = DB_PATH + DB_NAME;File file=new File(myPath);return file.exists();}

欢迎大家提出问题进行讨论

本人还在菜鸟阶段,所以还有很多东西需要去学习,也希望大家多多指教!

更多相关文章

  1. android开发实战之做手机号和邮编查询小程序
  2. 关于android真机访问本地电脑服务器以及访问数据库的那点事
  3. Android(安卓)sqlite数据库操作通用框架AHibernate(一)-CRUD示例
  4. 带你一步步破解Android微信聊天记录解决方案
  5. android 完整地操作数据库--日记本实例
  6. Android中个人推崇的数据库使用方式
  7. Android导出与使用带资源的lib包
  8. Unity3D链接Android手机端数据库
  9. Android将数据库保存到SD卡的实现

随机推荐

  1. android ScrollView--Linearlayout可以上
  2. 【android之ADB命令】ADB SHELL 命令乱码
  3. Android利用Ksoap2连接webservice 源码
  4. ubuntu 搭建android编译环境
  5. android > 获取 通讯录 信息
  6. android 音效
  7. android添加各种权限整理
  8. 【OOM】Android加载大图片OOM异常解决
  9. Android Fragment页打开相册
  10. net :: ERR_CLEARTEXT_NOT_PERMITTED