创建数据库
- 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() 放大得到执行,只需要把数据库版本比较之前增大一个数值即可。
以上步骤,即完成了数据库的创建和升级操作。增删改查这里就略过不表。
网友评论