在sdCard创建数据库(打造自己的SQLiteOpenHelper)

来源:互联网 发布:电子屏图文信息软件 编辑:程序博客网 时间:2024/06/06 05:40

1.在sd创建数据库

        项目需求,需要在sd卡上创建数据库,看了半天的SQLiteOpenHelper代码,主要的方法就是getWritableDatabase()和getReadableDatabase(),

都是一系列的判断,然后返回SQLiteDatabase mDatabase,但是为什么就会在/data/data/com.xxxx./xxx.db呢?

      认真看了代码之后,就会发现在getReadableDatabase()方法下:

              String path = mContext.getDatabasePath(mName).getPath();//这里由上下文得到的路径就是在data/data/xxxxx目录

               db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY);

       在getWritableDatabase()方法下有这样代码

          if (mName == null) {
                db = SQLiteDatabase.create(null);
            } else {
                db = mContext.openOrCreateDatabase(mName, 0, mFactory);//通过上下文创建数据库也是在data/data/下的
            }

那么要在sd卡上创建数据文件,那么改变他们的路径就应该可以了:

  private File getDatabasePath(String name) {
        File dir=new File(Environment.getExternalStorageDirectory(), "/demo");
        if(!dir.exists()) {
            dir.mkdirs();
        }

      //name 数据库名字
        return new File(dir, name);
   }

那么在getReadableDatabase()和getWritableDatabase()分别作如下地方的改动

 public synchronized SQLiteDatabase getReadableDatabase() {
     ..........
     SQLiteDatabase db = null;
           try {
               mIsInitializing = true;
               String path = getDatabasePath(mName).getPath();
//          原来的   String path = mContext.getDatabasePath(mName).getPath();
               db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDatabase.OPEN_READONLY);
               if (db.getVersion() != mNewVersion) {
                   throw new SQLiteException("Can't upgrade read-only database from version " +
                           db.getVersion() + " to " + mNewVersion + ": " + path);
               }
           ................
           } finally {
               mIsInitializing = false;
               if (db != null && db != mDatabase) db.close();
           }
    }
getWritableDatabase()
  public synchronized SQLiteDatabase getWritableDatabase() {
    ...........................
        try {
            mIsInitializing = true;
            if (mName == null) {
                db = SQLiteDatabase.create(null);
            } else {
   // 原来的    db = mContext.openOrCreateDatabase(mName, 0, mFactory);
                db = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(mName), mFactory);
            }
     ..................................
        } finally {
            mIsInitializing = false;
            if (success) {
                if (mDatabase != null) {
                    try { mDatabase.close(); } catch (Exception e) { }
//                    mDatabase.unlock();
                }
                mDatabase = db;
            } else {
//                if (mDatabase != null) mDatabase.unlock();
                if (db != null) db.close();
            }
        }
    }
 目前未证实为什么 mDatabase.lock();在自定义SQLiteOpenHelper的时候去没有这个方法,在相应的地方需要加上读写锁,防止并发访问出现问题。

2.下载一个db数据库文件放在sd卡并且读取操作

 有了上面的基础,那么很简单就可以清楚如何在sd卡上处理db文件了

db = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(mName)/.*db文件的路径*/, mFactory);

3.还可以很清楚的了解继承了SQLiteOpenHelper后如何调用 onCreate(db);和    onUpgrade(db, version, mNewVersion);

int version = db.getVersion();
            if (version != mNewVersion) {
                db.beginTransaction();
                try {
                    if (version == 0) {
                        onCreate(db);
                    } else {
                        onUpgrade(db, version, mNewVersion);
                    }
                    db.setVersion(mNewVersion);
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
                }
            }

 


原创粉丝点击