diff --git a/DBHelper.java b/DBHelper.java new file mode 100644 index 0000000..1c9fef1 --- /dev/null +++ b/DBHelper.java @@ -0,0 +1,111 @@ +package com.example.sparrownotes.util; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.util.ArrayMap; + +import com.example.sparrownotes.bean.NoteBean; +import com.example.sparrownotes.bean.UserBean; +import com.example.sparrownotes.util.Constant; +import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; + +import java.sql.SQLException; + +/** + * 数据库帮助类 + * + * @author Horsen + */ +@SuppressWarnings("AlibabaRemoveCommentedCode") +public class DBHelper extends OrmLiteSqliteOpenHelper { + /** + * 防止多线程同时操作, 实现单例模式, 并锁定线程 + * 数组存储App中所有的Dao对象的Map集合 + */ + private static DBHelper dbHelper = null; + private ArrayMap daos = new ArrayMap<>(); + + public static synchronized DBHelper getInstance(Context context) { + if (dbHelper == null) { + synchronized (DBHelper.class) { + if (dbHelper == null) { + dbHelper = new DBHelper(context); + } + } + } + return dbHelper; + } + + private DBHelper(Context context) { + super(context, Constant.DB_NAME, null, Constant.DB_VERSION); + } + + /** + * 包含创建表的语句 + * + * @param sqLiteDatabase + * @param connectionSource + */ + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) { + try { + TableUtils.createTable(connectionSource, UserBean.class); + TableUtils.createTable(connectionSource, NoteBean.class); + } catch (SQLException e) { + e.printStackTrace(); + } + + } + + /** + * 包含新建表的语句 + * 就是删了再创罢了 + * + * @param sqLiteDatabase + * @param connectionSource + * @param i + * @param i1 + */ + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) { + try { + TableUtils.dropTable(connectionSource, UserBean.class, false); + TableUtils.dropTable(connectionSource, NoteBean.class, false); + onCreate(sqLiteDatabase, connectionSource); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + /** + * 根据传入的Dao路径获取这个Dao的单例对象, 要么从daos中获取, 要么新建一个存入daos + */ + @Override + public synchronized Dao getDao(Class clazz) throws SQLException { + Dao dao = null; + String className = clazz.getSimpleName(); + if (daos.containsKey(className)) { + dao = daos.get(className); + } + if (dao == null) { + dao = super.getDao(clazz); + daos.put(className, dao); + } + return dao; + } + + /** + * 释放资源 + */ + @Override + public void close() { + super.close(); + for (String key : daos.keySet()) { + Dao dao = daos.get(key); + dao = null; + } + } +}