以前使用过安卓自带的sqlite数据库,但是是使用原生的方法实现的,最近接触到的项目是使用ORMLite框架实现的,感觉很好用,能够提高开发效率,而事实上,ormlite框架对数据的增删改查也是要优于原生的。
一、Gradle: compile 'com.j256.ormlite:ormlite-android:4.48'
二、创建DataBase
创建名为info.db的数据库 ,我这里只有一张表 基于StudentModel。
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
public static final int version = 1;
private static DatabaseHelper instance;
private DatabaseHelper(Context context) {
super(context, "info.db", null, version);
}
public static DatabaseHelper getInstance(Context context) {
if (instance == null) {
synchronized (DatabaseHelper.class) {
if (instance == null) {
instance = new DatabaseHelper(context);
}
}
}
return instance;
}
public static void release() {
synchronized (DatabaseHelper.class) {
instance = null;
}
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, StudentModel.class);
} catch (SQLException e) {
}
}
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
}
}
public class DaoProvider {
private Map<Class,BaseDao> mDaoMap;
private static DaoProvider ourInstance = new DaoProvider();
public static DaoProvider getInstance() {
return ourInstance;
}
private DaoProvider() {
mDaoMap = new HashMap<>();
}
public void clear() {
DatabaseHelper.release();
mDaoMap.clear();
}
public synchronized <T extends BaseDao> T getDao(Class<T> clazz) {
if (!mDaoMap.containsKey(clazz)) {
try {
T dao = clazz.newInstance();
mDaoMap.put(clazz, dao);
} catch (Exception e) {
throw new IllegalStateException("创建dao失败:" + clazz);
}
}
return (T) mDaoMap.get(clazz);
}
}
三、数据模型(数据表)
新建一个StudentModel.class
在StudentModel类上添加@DatabaseTable(tableName = "student"),标明这是数据库中的一张表。对应的这张表中的每一个字段,需要添加@DatabaseField注解,例如@DatabaseField(columnName = "name"),columnName 标明了字段名,即字段在数据中的列名。
@DatabaseTable (tableName = "student")
public class StudentModel extends BaseModel {
@DatabaseField (columnName = "name",useGetSet = true)
private String name;
@DatabaseField (columnName = "age" ,useGetSet = true)
private int age;
@DatabaseField(columnName = "tel",useGetSet = true)
private String rel;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getRel() {
return rel;
}
public void setRel(String rel) {
this.rel = rel;
}
}
这里StudentModel继承了BaseModel,因为我们擦欧洲哦数据库一般有多张表,共同的字段比如create_time、update_time等搞一个父类方便管理。
public class BaseModel implements Serializable {
public static final String ID = "id";
public static final String CREATE_TIME = "create_time";
public static final String UPDATE_TIME = "update_time";
public static final String DELETED = "deleted";
@DatabaseField(id = true, useGetSet = true,columnName = ID)
private String id;
@DatabaseField(format = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", columnName = CREATE_TIME, useGetSet = true)
private Date createTime;
@DatabaseField(format = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", columnName = UPDATE_TIME, useGetSet = true)
private Date updateTime;
@DatabaseField(columnName = DELETED,useGetSet = true)
private int deleted;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getCreateTime() {
return copyDate(createTime);
}
public void setCreateTime(Date createTime) {
this.createTime = copyDate(createTime);
}
public Date getUpdateTime() {
return copyDate(updateTime);
}
public void setUpdateTime(Date updateTime) {
this.updateTime = copyDate(updateTime);
}
public int getDeleted() {
return deleted;
}
public void setDeleted(int deleted) {
this.deleted = deleted;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BaseModel baseModel = (BaseModel) o;
return id != null ? id.equals(baseModel.id) : baseModel.id == null;
}
@Override
public int hashCode() {
return id != null ? id.hashCode() : 0;
}
public Date copyDate(Date date) {
return date == null ? null : new Date(date.getTime());
}
}
四、Model的Dao
对应StudentModel的StudentDao,我这里只实现了查询方法,比如insert等方法在BaseDao中实现
public class StudentDao extends BaseDao<StudentModel>{
public StudentDao() throws SQLException {
super();
}
public List<StudentModel> queryAll( ) {
try {
return getDao().queryBuilder().query();
} catch (SQLException e) {
}
return null;
}
}
BaseDao:为了方便使用,通过上下文的工具类AppContextUtils.getContext()来获得context
public class BaseDao<T extends BaseModel> {
protected DatabaseHelper mHelper;
protected Dao<T, String> mDao;
public BaseDao() throws SQLException {
try {
mHelper = DatabaseHelper.getInstance(AppContextUtils.getContext());
mDao = mHelper.getDao(getTClass());
}catch (SQLException e){
e.printStackTrace();
}
}
public SQLiteDatabase getDb() {
return mHelper.getWritableDatabase();
}
public FieldType[] getStableTableColumn() {
TableInfo tableInfo = null;
FieldType[] fieldTypes = null;
try {
tableInfo = new TableInfo(getDao().getConnectionSource(), (BaseDaoImpl)getDao(), getTClass());
fieldTypes = tableInfo.getFieldTypes();
} catch (SQLException e) {
e.printStackTrace();
}
return fieldTypes;
}
public boolean addColumn(String tableName, String columnName, String columnSpec) {
mHelper.getWritableDatabase().execSQL(String.format("ALTER TABLE %s ADD %s %s", tableName, columnName, columnSpec));
return true;
}
public String[] getColumns(String tableName) {
Cursor cursor = mHelper.getWritableDatabase().rawQuery(String.format("select * from %s where id=1", tableName), null);
String[] columnNames = cursor.getColumnNames();
return columnNames;
}
public Dao<T, String> getDao() {
return mDao;
}
public boolean isExist(T model) throws SQLException {
if (model == null || model.getId() == null) {
return false;
} else {
return mDao.queryForId(model.getId()) != null;
}
}
public int add(T model) throws SQLException {
if (model.getId() == null) {
model.setId(UUID.randomUUID().toString());
}
if (model.getCreateTime() == null) {
model.setCreateTime(new Date());
}
if (model.getUpdateTime() == null) {
model.setUpdateTime(new Date());
}
return mDao.create(model);
}
public synchronized Dao.CreateOrUpdateStatus addOrUpdate(T model) throws SQLException {
if (isExist(model)) {
return new Dao.CreateOrUpdateStatus(false, true, update(model));
} else {
return new Dao.CreateOrUpdateStatus(true, false, add(model));
}
}
public int delete(T model) throws SQLException {
return mDao.delete(model);
}
public int deleteById(String id) throws SQLException {
return mDao.deleteById(id);
}
public int update(T model) throws SQLException {
model.setUpdateTime(new Date());
return mDao.update(model);
}
public long querySize() throws SQLException {
return mDao.countOf();
}
public T query(String id) throws SQLException {
return mDao.queryForId(id);
}
public List<T> queryAll() throws SQLException {
return mDao.queryForAll();
}
protected Class<T> getTClass() {
return (Class<T>) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
}
AppContextUtils:需要在使用前调用init方法
public class AppContextUtils {
private static Context sAppContext;
private static long millTime = 0L;
private AppContextUtils() {
}
public static void init(Context ctx) {
sAppContext = ctx.getApplicationContext();
}
public static Context getContext() {
return sAppContext;
}
public static Context getContext(Context context) {
return context != null?context:sAppContext;
}
public static long getMafInitMilTime() {
return millTime;
}
public static void setMafInitMilTime(long setMillTime) {
millTime = setMillTime;
}
}
五、数据操作
铺垫了这么多,都是为了方便数据库扩展,接下来的方法就是对数据库进行操作
public class DatabaseService {
private StudentDao studentDao;
private static DatabaseService sInstance;
private DatabaseService(){
studentDao = DaoProvider.getInstance().getDao(StudentDao.class);
}
public static synchronized DatabaseService getInstance() {
if (sInstance == null) {
sInstance = new DatabaseService();
}
return sInstance;
}
public void reSet(){
studentDao = null;
sInstance = null;
}
public boolean insertOrUpdateMeeting(StudentModel meetingModel) {
try {
Dao.CreateOrUpdateStatus createOrUpdateStatus = studentDao.addOrUpdate(meetingModel);
return createOrUpdateStatus.getNumLinesChanged() == 1;
} catch (SQLException e) {
}
return false;
}
public List<StudentModel> search() {
return studentDao.queryAll();
}
}
在MainActivity调用
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button mBtnAdd;
private Button mBtnSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtnAdd = (Button)findViewById(R.id.button);
mBtnAdd.setOnClickListener(this);
mBtnSearch = (Button)findViewById(R.id.button2);
mBtnSearch.setOnClickListener(this);
AppContextUtils.init(MainActivity.this);
}
@Override
public void onClick(View view) {
if (view==mBtnAdd){
StudentModel studentModel = new StudentModel();
studentModel.setName("swd");
DatabaseService.getInstance().insertOrUpdateMeeting(studentModel);
return;
}
if (view == mBtnSearch){
List<StudentModel> studentModels = new ArrayList<StudentModel>();
studentModels = DatabaseService.getInstance().search();
studentModels.clear();
}
}
}
关于数据库更新
关于Android数据库升级的实践(以ormlite为例)
点击打开链接