美文网首页
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