作为android开发者,我们知道其有五种存储方法: 1)网络存储 2)文件存储 3)SharedPreferences 4)ContentProvider 5)SQLite数据库 以上除了网络存储是将数据存储在后台外,其余的都是基于本地的。在这里我主要讲解android SQLite数据库的使用以及使用sqlite打造一个草稿箱的功能。sqlite是一种关系型数据库,体积小运行库,其api也比较简单,可执行sql语句。
一般的,我们使用 SQLite数据库,首先我们需要创建一个类然后继承SQLiteOpenHelper这个抽象类,其默认需要重写实现onCreate和onUpgrade抽象方法,还需要创建一个类的构造函数。
- public class CustomDatabaseHelper extends SQLiteOpenHelper {
- //创建表
- public static final String DATA_DRAFTS = "create table drafts ("
- + "drafts_id integer primary key autoincrement, "
- + "uers_id varchar, "
- + "title varchar, "
- + "content varchar, "
- + "tag_id varchar)";
- public CustomDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
- super(context, name, factory, version);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL(DATA_DRAFTS);
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- }
- }
使用CustomDatabaseHelper的时候,会在onCreate中执行DATA_DRAFTS这条语句就会创建drafts这个表。 使用的时候,利用构造函数,将上下文context、数据库名字和版本号传进来就可以了,SQLiteOpenHelper和检测有没有该数据库,如果没有就会创建数据库并且调用onCreate方法,如果存在数据库并且数据库的版本号大于当前版本号就会升级数据库,也就是会调用onUpgrade方法。
- dbHelper = new CustomDatabaseHelper(this, "Drafts.db", null, 1);
sqlite数据库是支持sql编程的,当然其本身也提供了非常方便的数据库操作的api。 插入数据:
- SQLiteDatabase db = dbHelper.getWritableDatabase();
- ContentValues v = new ContentValues();
- v.put("uers_id", "001");
- v.put("title", "my first drafts");
- v.put("content", "hello world");
- v.put("tag_id", "ox001");
- db.insert("drafts", null, v);
更新数据db.update方法,删除数据db.delete方法,查询数据db.query方法。
接下来介绍操作数据库的另一种方式以及使用这种方式创建一个草稿箱。 首先创建一个数据库管理类DraftsDatabaseHelper,定义一些变量和sql数据。
- private Context mContext;
- //存放路径
- public static String DATABASE_PATH = Utils.getSdcardPath() ;//数据库存放路径
- public static final String DATABASE_NAME = "drafts.db";
- public static final String DRAFTS_TABLE = "drafts";
- public static final String DRAFTS_ID = "drafts_id";
- public static final String DRAFTS_TITLE = "title";
- public static final String DRAFTS_CONTENT = "content";
- public static final String TAG_ID = "tag_id";
- //创建表
- public static final String CREATE_DRAFTS = "CREATE TABLE IF NOT EXISTS "+DRAFTS_TABLE+"("
- + DRAFTS_ID+" integer primary key autoincrement, "
- + USER_ID+" varchar, "
- + DRAFTS_TITLE+" varchar, "
- + DRAFTS_CONTENT+" varchar , "
- + TAG_ID+" varchar )";
- private static SQLiteDatabase sDatabase;
- private static String sCurrentDir;
- //打开数据库
- private static SQLiteDatabase openDatabase(String dir){
- if (dir == null)
- return null;
- File file = new File(dir);
- if (!file.exists()) {
- if (!file.mkdirs()) {
- return null;
- }
- }
- if (sCurrentDir != null && sCurrentDir.equals(dir) && sDatabase != null && sDatabase.isOpen()) {
- return sDatabase;
- }
- try {
- if (sDatabase != null && sDatabase.isOpen()) {
- sDatabase.close();
- }
- sDatabase = null;
- SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dir + "/" + DATABASE_NAME, null);
- db.execSQL(CREATE_DRAFTS);
- Cursor cursor = db.query(DRAFTS_TABLE, null, null, null, null, null, null);
- String[] columnNames = cursor.getColumnNames();
- cursor.close();
- String strColumns = "";
- if (columnNames != null) {
- for (int i = 0; i < columnNames.length; i++) {
- strColumns += columnNames[i] + ",";
- }
- }
- if (!strColumns.contains(DRAFTS_ID))
- db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + DRAFTS_ID + " integer");
- if (!strColumns.contains(USER_ID))
- db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + USER_ID + " varchar");
- if (!strColumns.contains(DRAFTS_TITLE))
- db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + DRAFTS_TITLE + " varchar");
- if (!strColumns.contains(DRAFTS_CONTENT))
- db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + DRAFTS_CONTENT + " varchar");
- if (!strColumns.contains(TAG_ID))
- db.execSQL("ALTER TABLE " + DRAFTS_TABLE + " ADD " + TAG_ID + " varchar");
- sDatabase = db;
- sCurrentDir = dir;
- return db;
- } catch (Exception e) {
- System.out.println("" + e.getMessage());
- }
- return null;
- }
- //插入数据
- public static boolean add(String dir, CircleInfo.DraftsInfo info) {
- if (info == null) {
- return false;
- }
- SQLiteDatabase db = openDatabase(dir);
- if (db != null) {
- db.beginTransaction();
- try {
- ContentValues values = new ContentValues();
- values.put(USER_ID, info.drafts_user_id);
- values.put(DRAFTS_TITLE, info.drafts_title);
- values.put(DRAFTS_CONTENT, info.drafts_content);
- values.put(TAG_ID, info.tagId);
- db.insert(DRAFTS_TABLE, null, values);
- } catch(SQLiteConstraintException e) {
- e.printStackTrace();
- }
- db.setTransactionSuccessful();
- db.endTransaction();
- return true;
- }
- return false;
- }
- //更新数据
- public static boolean update(DraftsInfo info, String rootDir) {
- if (StrUtils.isEnpty(rootDir)) {
- return false;
- }
- File file = new File(rootDir);
- if (!file.exists()) {
- if (!file.mkdirs()) {
- return false;
- }
- }
- SQLiteDatabase db = openDatabase(rootDir);
- if (db != null) {
- try {
- ContentValues values = new ContentValues();
- values.put(USER_ID, info.drafts_user_id);
- values.put(DRAFTS_TITLE, info.drafts_title);
- values.put(DRAFTS_CONTENT, info.drafts_content);
- values.put(TAG_ID, info.tagId);
- db.update(DRAFTS_TABLE, values, DRAFTS_ID + "=?", new String[] {
- info.drafts_id + ""
- });
- return true;
- } catch(Exception e) {
- e.printStackTrace();
- return false;
- }
- }
- return false;
- }
- //删除数据
- public static boolean deleteByTagId(String tagId, String dir) {
- if (dir == null || tagId == null) return false;
- File file = new File(dir);
- if (!file.exists() || !file.isDirectory()) {
- return false;
- }
- SQLiteDatabase db = openDatabase(dir);
- if (db != null) {
- try {
- db.delete(DRAFTS_TABLE, TAG_ID + "=?", new String[] {
- tagId
- });
- return true;
- } catch(Exception e) {
- return false;
- }
- }
- return false;
- }
- //查询数据
- public static ArrayList < DraftsInfo > queryData(String path, String state) {
- if (TextUtils.isEmpty(path)) {
- return null;
- }
- String finalDir = path;
- File file = new File(finalDir);
- if (!file.exists()) {
- if (!file.mkdirs()) {
- return null;
- }
- }
- SQLiteDatabase db = openDatabase(finalDir);
- if (db != null) {
- try {
- Cursor cursor = db.rawQuery("select * " + " from " + DRAFTS_TABLE, null);
- if (cursor != null) {
- ArrayList < DraftsInfo > infos = cursorToMsgs(cursor);
- cursor.close();
- return infos;
- }
- } catch(Exception e) {
- return null;
- }
- }
- return null;
- }
- private static ArrayList < DraftsInfo > cursorToMsgs(Cursor cursor) {
- ArrayList < DraftsInfo > infos = new ArrayList < DraftsInfo > ();
- DraftsInfo info = null;
- cursor.moveToFirst();
- int columnCount = cursor.getColumnCount();
- while (!cursor.isAfterLast()) {
- info = new DraftsInfo();
- for (int i = 0; i < columnCount; i++) {
- String name = cursor.getColumnName(i);
- if (name.equals(DRAFTS_ID)) {
- info.drafts_id = cursor.getInt(i);
- }
- if (name.equals(USER_ID)) {
- info.drafts_user_id = cursor.getString(i);
- }
- if (name.equals(DRAFTS_TITLE)) {
- info.drafts_title = cursor.getString(i);
- }
- if (name.equals(DRAFTS_CONTENT)) {
- info.drafts_content = cursor.getString(i);
- }
- if (name.equals(TAG_ID)) {
- info.tagId = cursor.getString(i);
- }
- }
- infos.add(info);
- cursor.moveToNext();
- }
- return infos;
- }
以上就是打开sqlite数据库的另外一种方式,以及创建的草稿箱数据库,大家可以根据草稿箱需要,添加自己业务所需要的字段进行存储。使用的时候只需要提供数据库的存放路径即可。这种方式主要是根据需求可以将数据库存放在自己想要存放的地方。 使用时需要提供存放路径,如查询数据
- ArrayList<DraftsInfo> infos = DraftsDatabaseHelper.queryData(DraftsDatabaseHelper.DATABASE_PATH);
本文希望对大家的开发有所帮助。如果文章写得有所不足,希望大家指出来,我会好好的更正,大家互相学习。
欢迎大家关注我的公众号,我会继续努力,分享技术、生活和感悟。
来源: https://juejin.im/post/5a30f78151882503dc53b400