美文网首页
Android 笔记 —— 数据库存储

Android 笔记 —— 数据库存储

作者: GinkWang | 来源:发表于2017-05-02 10:38 被阅读65次

    创建数据库

    • SQliteOpenHelper 帮助类的使用

    使用 SQliteOpenHelper 帮助类可以很方便地对数据库进行管理,使用它,数据库的创建和升级就变得十分简单。

    SQliteOpenHelper 是一个抽象类,要使用它的话,必须建立一个自己的帮助类去继承它。

    public class DatabaseHelper extends SQLiteOpenHelper {
        private static final String TAG = "DatabaseHelper";
    
        public static final String DATABASE_NAME = "FirstAidShenyang_DB"; //数据库名称"
        public static final int DATABASE_VERSION = 1001;
    
        //必须有构造函数
        public DatabaseHelper(Context pContext) {
            super(pContext, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        //数据库第一次创建时执行,实际上是第一次得到SQLiteDatabase对象的时候才会调用这个方法
        @Override
        public void onCreate(SQLiteDatabase db) {
            Log.i(TAG, "onCreate: 创建数据库");
        }
    
        //更新数据库时执行此方法
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.i(TAG, "onUpgrade: 更新数据库");
        }
    }
    

    SQliteOpenHelper 构造函数共接收四个参数,上下文(Context)、函数名、自定义 Cuesor (一般传入 null)、数据库版本。

    构建完数据库实例之后,即可调用 getReadableDatabase 或 getWritAbleDatabase 即可创建数据库,数据库文件默认存放在 /data/data/<package name>/database/ 目录下。

    • 创建数据库
      编写建表语句

      public String CREATE_TABLE_CONTENT =
            "CREATE TABLE if not exists " + ContentDB.SQLITE_TABLE + " (" +
                    ContentDB.KEY_ID + " integer PRIMARY KEY autoincrement, " +
                    ContentDB.KEY_CREATE_TIME + ", " +
                    ContentDB.KEY_MODIFY_TIME + ", " +
                    ContentDB.KEY_CONTENT_TITLE + ", " +
                    ContentDB.KEY_CONTENT_TEXT + ", " +
                    ContentDB.KEY_HAS_IMG + ", " +
                    ContentDB.KEY_IMG_ARRAY + ", " +
                    ContentDB.KEY_WORD_COUNT + ", " +
                    ContentDB.KEY_COLOR_BG + ", " +
                    ContentDB.KEY_IN_GROUP + ", " +
                    ContentDB.KEY_IS_SECRET + ", " +
                    ContentDB.KEY_IS_DELETE + ", " +
                    ContentDB.KEY_DELETE_TIME + ");";
      

      执行建表语句

      db.execSQL(CREATE_TABLE_CONTENT);
      

      数据库表实体类

      public class ContentDB {
        public static final String TAG = "ContentDB";
        public static final String SQLITE_TABLE = "ContentTable";
      
        public static final String KEY_ID = "id";//自增长 id
        public static final String KEY_CREATE_TIME = "CREATE_TIME";//创建时间
        public static final String KEY_MODIFY_TIME = "MODIFY_TIME";//修改时间
        public static final String KEY_CONTENT_TITLE = "CONTENT_TITLE";//标题
        public static final String KEY_CONTENT_TEXT = "CONTENT_TEXT";//内容
        public static final String KEY_HAS_IMG = "HAS_IMG";//是否有图片
        public static final String KEY_IMG_ARRAY = "IMG_ARRAY";//图片组
        public static final String KEY_WORD_COUNT = "WORD_COUNT";//字数统计
        public static final String KEY_COLOR_BG = "COLOR_BG";//背景色
        public static final String KEY_IN_GROUP = "IN_GROUP";//所在组
        public static final String KEY_IS_SECRET = "IS_SECRET";//是否加密
        public static final String KEY_IS_DELETE = "IS_DELETE";//是否删除
        public static final String KEY_DELETE_TIME = "DELETE_TIME";//删除时间
      
        private Context mContext;
        private DatabaseHelper mDatabaseHelper;
        private SQLiteDatabase mSQLiteDatabase;
      
        public ContentDB(Context pContext) {
            this.mContext = new DatabaseContext(pContext);
            this.mDatabaseHelper = new DatabaseHelper(mContext);
            this.mSQLiteDatabase = mDatabaseHelper.getWritableDatabase();
            this.mSQLiteDatabase.setLocale(Locale.CHINA);
        }
      
        public void closeDB() {
            if (mDatabaseHelper != null) {
                Log.i(TAG, "closeDB: close ContentDB");
                mDatabaseHelper.close();
            }
        }
      }
      
    • 将数据库文件存储在 SDcard 上
      数据库文件默认存放在 /data/data/<package name>/database/ 目录下,卸载应用的同时会将应用数据一同删除。但如果想保留这些用户信息的话(比如记单词软件下载的单词表),就必须将应用数据库文件存储在别处。

      /**
       * 用于支持对存储在SD卡上的数据库的访问
       * Created by Wang-gk on 2017/4/30.
       */
      public class DatabaseContext extends ContextWrapper {
        public DatabaseContext(Context base) {
            super(base);
        }
      
        /**
         * 获得数据库路径,如果不存在,则创建对象对象
         * @param    name
         */
        @Override
        public File getDatabasePath(String name) {
            //判断是否存在sd卡
            boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
            if(!sdExist){//如果不存在,
                Log.e("SD卡管理:", "SD卡不存在,请加载SD卡");
                return null;
            }
            else{//如果存在
                //获取sd卡路径
                String dbDir=android.os.Environment.getExternalStorageDirectory().toString();
                dbDir += "/FastNote";//数据库所在目录
                String dbPath = dbDir+"/"+name;//数据库路径
                //判断目录是否存在,不存在则创建该目录
                File dirFile = new File(dbDir);
                if(!dirFile.exists())
                    dirFile.mkdirs();
      
                //数据库文件是否创建成功
                boolean isFileCreateSuccess = false;
                //判断文件是否存在,不存在则创建该文件
                File dbFile = new File(dbPath);
                if(!dbFile.exists()){
                    try {
                        isFileCreateSuccess = dbFile.createNewFile();//创建文件
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                else
                    isFileCreateSuccess = true;
      
                //返回数据库文件对象
                if(isFileCreateSuccess)
                    return dbFile;
                else
                    return null;
            }
        }
      
        /**
         * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
         *
         * @param    name
         * @param    mode
         * @param    factory
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode,
                                                   SQLiteDatabase.CursorFactory factory) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
            return result;
        }
      
        /**
         * Android 4.0会调用此方法获取数据库。
         *
         * @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int,
         *              android.database.sqlite.SQLiteDatabase.CursorFactory,
         *              android.database.DatabaseErrorHandler)
         * @param    name
         * @param    mode
         * @param    factory
         * @param     errorHandler
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory,
                                                   DatabaseErrorHandler errorHandler) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
            return result;
        }
      }
      

      使用

      DatabaseContext dbContext = new DatabaseContext(this);  
      SdCardDBHelper dbHelper = new SdCardDBHelper(dbContext);  
      

      别忘记加读写 SD 卡的权限

      <uses-permission   android:name="android.permission.WRITE_EXTERNAL_STORAGE">  </uses-permission>
      
    • 初始化数据库

      public class MainActivity extends AppCompatActivity {
      
        private static final String TAG = "MainActivity";
      
        private Context mContext;
        private ContentDB mContentDB;
        private GroupDB mGroupDB;
        private ImageDB mImageDB;
      
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            Log.i(TAG, "onCreate");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = this;
            initDB();
        }
      
        //初始化数据库
        private void initDB() {
            mContentDB = new ContentDB(mContext);
            mGroupDB = new GroupDB(mContext);
            mImageDB = new ImageDB(mContext);
        }
      
        @Override
        protected void onPause() {
            Log.i(TAG, "onPause");
            super.onPause();
            mContentDB.closeDB();
            mGroupDB.closeDB();
            mImageDB.closeDB();
        }
      }
      

    升级数据库

    数据库升级要用到 onUpgrade 方法。

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //删除原有表单
        db.execSQL("drop table if exists ***");
        db.execSQL("drop table if exists ***");
        //重新执行 onCreate() 方法
        onCreate(db);
    }
    

    先删除原有表,因为新建表时如果发现已存在该表,就会直接报错。然后再执行 onCreate() 方法。想要 onUpgrade() 放大得到执行,只需要把数据库版本比较之前增大一个数值即可。

    以上步骤,即完成了数据库的创建和升级操作。增删改查这里就略过不表。


    相关文章

      网友评论

          本文标题:Android 笔记 —— 数据库存储

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