ORMLite Android
by andyang
About me
• 哲偉、Andy 、⼩小⽺羊
• Android Code Club
• Every Wed. 19:00 - 22:00 果⼦子咖啡
• Android third-party gitbook
• Join us
• Android Developer
為何我今天在這
聖亞:我報名這次的主題了
我:很好啊
聖亞:我順便幫你報了
OS:WTF
我:!!!
就這樣被推坑了,參加讀書會好處多多
可練就⼀一⾝身隨時被推坑的技能
豪華ORM就此誕⽣生
彥彬表⽰示....
有⼈人沒有使⽤用過ORM嗎?
有何不同?
進⼊入正題
使⽤用 ORMLite
製作⼀一對多資料關聯
Data Table User
@DatabaseTable(tableName = "User")
public class User {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private String name;
@DatabaseField
private int sort;
@ForeignCollectionField
private ForeignCollection<Group> groups;
public User() {}
}
Data Table Group
@DatabaseTable(tableName = "Group")
public class Group {
@DatabaseField(generatedId = true)
private int id;
@DatabaseField
private String name;
@DatabaseField
private String description;
@DatabaseField(foreign = true, foreignAutoRefresh =
true, canBeNull = false, columnName = "user_id")
private User user;
public Group() {}
}
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "Demo";
private static DatabaseHelper instance;
private DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public static synchronized DatabaseHelper getHelper(Context context) {
context = context.getApplicationContext();
if (instance == null) {
synchronized (DatabaseHelper.class) {
if (instance == null)
instance = new DatabaseHelper(context);
}
}
return instance;
}
}
DatabaseHelper
onCreate & onUpdate
@Override
public void onUpgrade(SQLiteDatabase database, ConnectionSource
connectionSource, int oldVersion, int newVersion) {
try {
TableUtils.dropTable(connectionSource, User.class, true);
TableUtils.dropTable(connectionSource, Group.class, true);
onCreate(database, connectionSource);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onCreate(SQLiteDatabase database, ConnectionSource
connectionSource) {
try {
TableUtils.createTable(connectionSource, User.class);
TableUtils.createTable(connectionSource, Group.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
Abstract Base Dao
public abstract class BaseDao<T, ID> {
private Dao<T, ID> dao;
private DatabaseHelper helper;
public BaseDao(Context context, Class<T> clazz) {
try {
helper = DatabaseHelper.getHelper(context);
dao = helper.getDao(clazz);
} catch (SQLException e) {
e.printStackTrace();
}
}
public Dao<T, ID> getDao() {
return dao;
}
}
CRUD
public int insert(T item) {
int id;
try {
id = dao.create(item);
} catch (SQLException e) {
e.printStackTrace();
id = -1;
}
return id;
}
public int deleteById(ID primaryKey) {
int id;
try {
id = dao.deleteById(primaryKey);
} catch (SQLException e) {
e.printStackTrace();
id = -1;
}
return id;
}
public int update(T item) {
int id;
try {
id = dao.update(item);
} catch (SQLException e) {
e.printStackTrace();
id = -1;
}
return id;
}
public T getById(ID id) {
try {
return dao.queryForId(id);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
getAll, max, minpublic List<T> getAll() {
try {
return dao.queryBuilder().orderBy("id", false).query();
} catch (SQLException e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public List<T> getAll(boolean isAsc) {
try {
return dao.queryBuilder().orderBy("id", isAsc).query();
} catch (SQLException e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public List<T> getAll(String field, boolean isAsc) {
try {
return dao.queryBuilder().orderBy(field, isAsc).query();
} catch (SQLException e) {
e.printStackTrace();
return Collections.emptyList();
}
}
public T maxOfFieldItem(String field) throws Exception {
return dao.queryBuilder().orderBy(field, false).limit(1L).query().get(0);
}
public T minOfFieldItem(String field) throws Exception {
return dao.queryBuilder().orderBy(field, true).limit(1L).query().get(0);
}
Transaction
public void insertWithTransaction(final List<T> items) {
try {
TransactionManager.callInTransaction(helper.getConnectionSource(),
new Callable<Void>() {
@Override
public Void call() throws Exception {
for (T t : items) {
dao.create(t);
}
return null;
}
});
} catch (SQLException e) {
e.printStackTrace();
}
}
Custom Dao
public class UserDao extends BaseDao<User, Integer>{
public UserDao(Context context) {
super(context, User.class);
}
public void swap(int sourceId, int targetId) {
int sourceSort = getById(sourceId).getSort();
int targetSort = getById(targetId).getSort();
update(getById(sourceId).setSort(targetSort));
update(getById(targetId).setSort(sourceSort));
}
@Override
public int insert(User item) {
try {
item.setSort(maxOfFieldItem("sort").getSort() + 1);
}catch (Exception e){
item.setSort(1);
e.printStackTrace();
}
return super.insert(item);
}
}
Github ORMLiteDemo
DEMO

ORMLite Android

  • 1.
  • 2.
    About me • 哲偉、Andy、⼩小⽺羊 • Android Code Club • Every Wed. 19:00 - 22:00 果⼦子咖啡 • Android third-party gitbook • Join us • Android Developer
  • 3.
  • 4.
  • 5.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
    Data Table User @DatabaseTable(tableName= "User") public class User { @DatabaseField(generatedId = true) private int id; @DatabaseField private String name; @DatabaseField private int sort; @ForeignCollectionField private ForeignCollection<Group> groups; public User() {} }
  • 12.
    Data Table Group @DatabaseTable(tableName= "Group") public class Group { @DatabaseField(generatedId = true) private int id; @DatabaseField private String name; @DatabaseField private String description; @DatabaseField(foreign = true, foreignAutoRefresh = true, canBeNull = false, columnName = "user_id") private User user; public Group() {} }
  • 13.
    public class DatabaseHelperextends OrmLiteSqliteOpenHelper { private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "Demo"; private static DatabaseHelper instance; private DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public static synchronized DatabaseHelper getHelper(Context context) { context = context.getApplicationContext(); if (instance == null) { synchronized (DatabaseHelper.class) { if (instance == null) instance = new DatabaseHelper(context); } } return instance; } } DatabaseHelper
  • 14.
    onCreate & onUpdate @Override publicvoid onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) { try { TableUtils.dropTable(connectionSource, User.class, true); TableUtils.dropTable(connectionSource, Group.class, true); onCreate(database, connectionSource); } catch (SQLException e) { e.printStackTrace(); } } @Override public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) { try { TableUtils.createTable(connectionSource, User.class); TableUtils.createTable(connectionSource, Group.class); } catch (SQLException e) { e.printStackTrace(); } }
  • 15.
    Abstract Base Dao publicabstract class BaseDao<T, ID> { private Dao<T, ID> dao; private DatabaseHelper helper; public BaseDao(Context context, Class<T> clazz) { try { helper = DatabaseHelper.getHelper(context); dao = helper.getDao(clazz); } catch (SQLException e) { e.printStackTrace(); } } public Dao<T, ID> getDao() { return dao; } }
  • 16.
    CRUD public int insert(Titem) { int id; try { id = dao.create(item); } catch (SQLException e) { e.printStackTrace(); id = -1; } return id; } public int deleteById(ID primaryKey) { int id; try { id = dao.deleteById(primaryKey); } catch (SQLException e) { e.printStackTrace(); id = -1; } return id; } public int update(T item) { int id; try { id = dao.update(item); } catch (SQLException e) { e.printStackTrace(); id = -1; } return id; } public T getById(ID id) { try { return dao.queryForId(id); } catch (SQLException e) { e.printStackTrace(); return null; } }
  • 17.
    getAll, max, minpublicList<T> getAll() { try { return dao.queryBuilder().orderBy("id", false).query(); } catch (SQLException e) { e.printStackTrace(); return Collections.emptyList(); } } public List<T> getAll(boolean isAsc) { try { return dao.queryBuilder().orderBy("id", isAsc).query(); } catch (SQLException e) { e.printStackTrace(); return Collections.emptyList(); } } public List<T> getAll(String field, boolean isAsc) { try { return dao.queryBuilder().orderBy(field, isAsc).query(); } catch (SQLException e) { e.printStackTrace(); return Collections.emptyList(); } } public T maxOfFieldItem(String field) throws Exception { return dao.queryBuilder().orderBy(field, false).limit(1L).query().get(0); } public T minOfFieldItem(String field) throws Exception { return dao.queryBuilder().orderBy(field, true).limit(1L).query().get(0); }
  • 18.
    Transaction public void insertWithTransaction(finalList<T> items) { try { TransactionManager.callInTransaction(helper.getConnectionSource(), new Callable<Void>() { @Override public Void call() throws Exception { for (T t : items) { dao.create(t); } return null; } }); } catch (SQLException e) { e.printStackTrace(); } }
  • 19.
    Custom Dao public classUserDao extends BaseDao<User, Integer>{ public UserDao(Context context) { super(context, User.class); } public void swap(int sourceId, int targetId) { int sourceSort = getById(sourceId).getSort(); int targetSort = getById(targetId).getSort(); update(getById(sourceId).setSort(targetSort)); update(getById(targetId).setSort(sourceSort)); } @Override public int insert(User item) { try { item.setSort(maxOfFieldItem("sort").getSort() + 1); }catch (Exception e){ item.setSort(1); e.printStackTrace(); } return super.insert(item); } }
  • 20.
  • 21.