package com.litesuits.orm.samples; import android.os.Bundle; import com.litesuits.orm.LiteOrm; import com.litesuits.orm.db.DataBaseConfig; import com.litesuits.orm.db.assit.QueryBuilder; import com.litesuits.orm.db.assit.WhereBuilder; import com.litesuits.orm.db.model.ColumnsValue; import com.litesuits.orm.db.model.ConflictAlgorithm; import com.litesuits.orm.log.OrmLog; import com.litesuits.orm.model.single.*; import com.litesuits.orm.test.SqliteUtils; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; public class SingleTestActivity extends BaseActivity { //Timer timer; static LiteOrm liteOrm; static Man uComplex, uAlice, uMax, uMin; /** * object relation mapping test * man:address -> 1:n */ static ConcurrentLinkedQueue<Address> addrList; /** * man:teacher -> n:n */ static ArrayList<Boss> bossList; /** * man:company -> n:1 */ static Company company; /** * man:wife -> 1:1 */ static Wife wife1, wife2; /** * 在{@link com.litesuits.orm.samples.BaseActivity#onCreate(android.os.Bundle)}中设置视图 */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setSubTitile(getString(R.string.sub_title)); mockData(); if (liteOrm == null) { DataBaseConfig config = new DataBaseConfig(this, "liteorm.db"); config.debugged = true; // open the log config.dbVersion = 1; // set database version config.onUpdateListener = null; // set database update listener liteOrm = LiteOrm.newSingleInstance(config); } } @Override public String getMainTitle() { return getString(R.string.title); } @Override public String[] getButtonTexts() { return getResources().getStringArray(R.array.orm_test_case); } @Override public Runnable getButtonClickRunnable(final int id) { //Main UI Thread //makeOrmTest(id); return new Runnable() { @Override public void run() { //Child Thread makeOrmTest(id); } }; } /** * <item>Save(Insert Or Update)</item> * <item>Insert</item> * <item>Update</item> * <item>Update Column</item> * <item>Query All</item> * <item>Query By WhereBuilder</item> * <item>Query By ID</item> * <item>Query Any U Want</item> * <item>Mapping Test</item> * <item>Delete</item> * <item>Delete By Index</item> * <item>Delete By WhereBuilder</item> * <item>Delete All</item> * <item>LiteOrm Faster: Large-scale Test(100,000)</item> * <item>SQLiteDatabase: Large-scale Test(100,000)</item> */ private void makeOrmTest(int id) { switch (id) { case 0: testSave(); break; case 1: testInsert(); break; case 2: testUpdate(); break; case 3: testUpdateColumn(); break; case 4: testQueryAll(); break; case 5: testQueryByWhere(); break; case 6: testQueryByID(); break; case 7: testQueryAnyUwant(); break; case 8: testMapping(); break; case 9: testDelete(); break; case 10: testDeleteByIndex(); break; case 11: testDeleteByWhereBuilder(); break; case 12: testDeleteAll(); break; case 13: testLargeScaleUseLite(); break; case 14: testLargeScaleUseSystem(); break; default: break; } } private void testSave() { liteOrm.save(uMax); liteOrm.save(uMin); liteOrm.save(company); liteOrm.save(wife1); liteOrm.save(wife2); //保存任意集合 liteOrm.save(addrList); liteOrm.save(bossList); } private void testInsert() { liteOrm.insert(uAlice, ConflictAlgorithm.Replace); liteOrm.insert(uComplex, ConflictAlgorithm.Rollback); } private void testUpdate() { //交换2个User的信息 long id = uMax.getId(); uMax.setId(uMin.getId()); uMin.setId(id); // save : 既可以当insert 也可以做update,非常灵活 long c = liteOrm.save(uMax); OrmLog.i(this, "update User Max: " + c); // update:仅能在已经存在时更新 c = liteOrm.update(uMin, ConflictAlgorithm.Replace); OrmLog.i(this, "update User Min: " + c); //更新任意的整个集合 bossList.get(0).setName("Cang Jin Kong"); bossList.get(1).setName("Song Dao Feng"); liteOrm.update(bossList, ConflictAlgorithm.Fail); } /** * 仅更新指定字段 */ private void testUpdateColumn() { //1. 集合更新实例: Boss boss0 = bossList.get(0); boss0.address = "随意写个乱七八糟的地址,反正我不会更新它"; // 仅更新这一个字段 boss0.phone = "168 8888 8888"; Boss boss1 = bossList.get(1); boss1.address = "呵呵呵呵呵"; boss1.phone = "168 0000 0000"; ColumnsValue cv = new ColumnsValue(new String[]{"phone"}); long c = liteOrm.update(bossList, cv, ConflictAlgorithm.None); OrmLog.i(this, "update boss :" + c); //2. 更新单个实体(强制赋指定值)示例: wife1.des = "随意写个乱七八糟的描述,反正它会被覆盖"; wife1.bm = "实体自带值"; wife1.age = 18; cv = new ColumnsValue(new String[]{"des", "bm", "age"}, new Object[]{"外部强制赋值地址", null, 20}); c = liteOrm.update(wife1, cv, ConflictAlgorithm.None); OrmLog.i(this, "update wife1 " + wife1.name + ": " + c); } private void testQueryAll() { ArrayList<Man> query = liteOrm.query(Man.class); ArrayList<Address> as = liteOrm.query(Address.class); ArrayList<Wife> ws = liteOrm.query(Wife.class); ArrayList<Company> cs = liteOrm.query(Company.class); ArrayList<Boss> ts = liteOrm.query(Boss.class); if (as != null) { for (Address uu : as) { OrmLog.i(this, "query Address: " + uu); } } if (ws != null) { for (Wife uu : ws) { OrmLog.i(this, "query Wife: " + uu); } } if (cs != null) { for (Company uu : cs) { OrmLog.i(this, "query Company: " + uu); } } if (ts != null) { for (Boss uu : ts) { OrmLog.i(this, "query Teacher: " + uu); } } if (query != null) { for (Man uu : query) { OrmLog.i(this, "query user: " + uu); } } } private void testQueryByWhere() { // 模糊查询:所有带“山”字的地址 QueryBuilder<Address> qb = new QueryBuilder<Address>(Address.class) .where(Address.COL_ADDRESS + " LIKE ?", new String[]{"%山%"}); printAddress(liteOrm.query(qb)); //AND关系 获取 南京的香港路 qb = new QueryBuilder<Address>(Address.class) .whereEquals(Address.COL_CITY, "南京") .whereAppendAnd() .whereEquals(Address.COL_ADDRESS, "香港路"); printAddress(liteOrm.query(qb)); //OR关系 获取所有 地址为香港路 ,和 青岛 的所有地址 qb = new QueryBuilder<Address>(Address.class) .whereEquals(Address.COL_ADDRESS, "香港路") .whereAppendOr() .whereEquals(Address.COL_CITY, "青岛"); printAddress(liteOrm.query(qb)); //IN语句 获取所有 城市为杭州 和 北京 的地址 qb = new QueryBuilder<Address>(Address.class) .whereIn(Address.COL_CITY, new String[]{"杭州", "北京"}); printAddress(liteOrm.query(qb)); //IN语句 获取同时满足:非香港路 & ID>5 & address包含山 qb = new QueryBuilder<Address>(Address.class) .whereNoEquals(Address.COL_ADDRESS, "香港路") .whereAppendAnd() .whereGreaterThan(Address.COL_ID, 5) .whereAppendAnd() .whereAppend(Address.COL_ADDRESS + " LIKE ?", new String[]{"%山%"}); printAddress(liteOrm.query(qb)); } private void testQueryByID() { Man man = liteOrm.queryById(uComplex.getId(), Man.class); OrmLog.i(this, "query id: " + uComplex.getId() + ",MAN: " + man); } private void testQueryAnyUwant() { long nums = liteOrm.queryCount(Address.class); OrmLog.i(this, "Address All Count : " + nums); QueryBuilder<Address> qb = new QueryBuilder<Address>(Address.class) .columns(new String[]{Address.COL_ADDRESS}) .appendOrderAscBy(Address.COL_ADDRESS) .appendOrderDescBy(Address.COL_ID) .distinct(true) .where(Address.COL_ADDRESS + "=?", new String[]{"香港路"}); nums = liteOrm.queryCount(qb); OrmLog.i(this, "Address All Count : " + nums); List<Address> addrList = liteOrm.query(qb); for (Address uu : addrList) { OrmLog.i(this, "Query Address: " + uu); } } private void testMapping() { // 先找出来相关的实体 ArrayList<Man> mans = liteOrm.query(Man.class); ArrayList<Address> as = liteOrm.query(Address.class); ArrayList<Wife> ws = liteOrm.query(Wife.class); ArrayList<Company> cs = liteOrm.query(Company.class); ArrayList<Boss> ts = liteOrm.query(Boss.class); // 为它们映射关系 liteOrm.mapping(mans, as); liteOrm.mapping(mans, ws); liteOrm.mapping(mans, cs); liteOrm.mapping(mans, ts); //可以看到与Man关联的Teacher、Company、Address都智能映射给Man对应的各个的实例了。 for (Man uu : mans) { OrmLog.i(this, "query user: " + uu); } for (Wife uu : ws) { OrmLog.i(this, "query Wife: " + uu); } for (Company uu : cs) { OrmLog.i(this, "query Company: " + uu); } for (Boss uu : ts) { OrmLog.i(this, "query Teacher: " + uu); } } private void testDelete() { liteOrm.delete(uMin); liteOrm.delete(uMax); liteOrm.delete(uAlice); liteOrm.delete(uComplex); // delete 任意 collection liteOrm.delete(bossList); } private void testDeleteByIndex() { // 最后一个参数可为null,默认按ID升序排列 // 按id升序,删除[2, size-1],结果:仅保留第一个和最后一个 liteOrm.delete(Address.class, 2, addrList.size() - 1, Address.COL_ID); } private void testDeleteByWhereBuilder() { //AND关系 删掉 南京 的 香港路 第一种写法 liteOrm.delete(WhereBuilder .create(Address.class) .equals(Address.COL_ADDRESS, "香港路") .andEquals(Address.COL_CITY, "南京")); //AND关系 删掉 南京 的 香港路 第二种写法 liteOrm.delete(WhereBuilder .create(Address.class) .where("address=? AND city=?", new String[]{"香港路", "南京"})); //AND关系 删掉 南京 的 香港路 第三种写法 liteOrm.delete(WhereBuilder .create(Address.class) .where("address=? AND city=?", "香港路", "南京")); printAllAddress(); //OR关系 删掉所有地址为 香港路 ,同时删掉 青岛的所有地址 liteOrm.delete(WhereBuilder .create(Address.class) .equals(Address.COL_ADDRESS, "香港路") .orEquals(Address.COL_CITY, "青岛")); printAllAddress(); //IN语句 删掉所有城市为 杭州 或 北京的地址 liteOrm.delete(WhereBuilder .create(Address.class) .in(Address.COL_CITY, new String[]{"杭州", "北京"})); printAllAddress(); //IN语句 删掉所有 非香港路 并且 ID>10 liteOrm.delete(WhereBuilder .create(Address.class) .equals(Address.COL_ADDRESS, "夫子庙") .and() .greaterThan(Address.COL_ID, 5)); printAllAddress(); } private void testDeleteAll() { liteOrm.deleteAll(Address.class); liteOrm.deleteAll(Company.class); liteOrm.deleteAll(Wife.class); liteOrm.deleteAll(Man.class); liteOrm.deleteAll(Boss.class); // 顺带测试:连库文件一起删掉 liteOrm.deleteDatabase(); // 顺带测试:然后重建一个新库 liteOrm.openOrCreateDatabase(); // 满血复活 } /** * 100 000 条数据 */ final int MAX = 100000; private void testLargeScaleUseLite() { // LiteOrm 插入10w条数的效率测试 SqliteUtils.testLargeScaleUseLiteOrm(liteOrm, MAX); } private void testLargeScaleUseSystem() { // 原生android代码 插入10w条数的效率测试 SqliteUtils.testLargeScaleUseDefault(SingleTestActivity.this, MAX); } private void printAllAddress() { printAddress(liteOrm.query(Address.class)); } private void printAddress(List<Address> addrList) { for (Address uu : addrList) { OrmLog.i(this, "Address: " + uu); } } private void mockData() { if (uAlice != null) { return; } uAlice = new Man(0, "alice", 18, false, (short) 12345, (byte) 123, 0.56f, 123.456d, 'c'); uMax = new Man(0, "max", 99, false, Short.MAX_VALUE, Byte.MAX_VALUE, Float.MAX_VALUE, Double.MAX_VALUE, Character.MAX_VALUE); uMin = new Man(0, "min", 1, true, Short.MIN_VALUE, Byte.MIN_VALUE, Float.MIN_VALUE, Double.MIN_VALUE, Character.MIN_VALUE); uComplex = new Man(0, null, 0, false); uComplex.name = "complex"; uComplex.setAge(18); uComplex.aShort = 32766; uComplex.aByte = 126; uComplex.aFloat = Float.MAX_VALUE; uComplex.setaDouble(Double.MAX_VALUE); uComplex.setLogin(true); uComplex.setDate(new Date(System.currentTimeMillis())); uComplex.setImg(new byte[]{23, 34, 77, 23, 19, 11}); uComplex.def_bool = true; uComplex.def_int = 922; uComplex.conflict = "cutom"; uComplex.map = new HashMap<Long, String>(); uComplex.map.put(1002L, "1002 sdfsd324443534534534"); uComplex.map.put(1003L, "1003 3dfgdfg24443534534534"); uComplex.map.put(1004L, "1004 sdfsdg324443534534534"); uComplex.map.put(1005L, "1005 dfsfd324443534534534"); // 1 to N addrList = new ConcurrentLinkedQueue<Address>(); addrList.add(new Address("1 西湖 ", "杭州")); addrList.add(new Address("2 武林 ", "杭州")); addrList.add(new Address("3 西二旗", "北京")); addrList.add(new Address("4 公主坟", "北京")); addrList.add(new Address("夫子庙", "南京")); addrList.add(new Address("中山陵", "南京")); addrList.add(new Address("西山陵", "南京")); addrList.add(new Address("香港路", "南京")); addrList.add(new Address("香港路", "杭州")); addrList.add(new Address("香港路", "青岛")); addrList.add(new Address("海尔路", "青岛")); addrList.add(new Address("海信路", "青岛")); uMax.addrList = addrList; // N to N ArrayList<Man> manlist = new ArrayList<Man>(); manlist.add(uAlice); manlist.add(uComplex); bossList = new ArrayList<Boss>(); Boss cang = new Boss("Cang boss", manlist); Boss song = new Boss("Song boss", manlist); bossList.add(cang); bossList.add(song); uAlice.bosses = bossList; uComplex.bosses = bossList; // 1 To 1 wife1 = new Wife("Echo", uComplex); wife1.type = Wife.Type.enumOne; uComplex.wife = wife1; wife2 = new Wife("Yamaidi", uMax); wife2.type = Wife.Type.enumTwo; uMax.wife = wife2; // N To 1 company = new Company("Apple Tech Co.Ltd", manlist); uComplex.company = company; uAlice.company = company; // Array // uComplex.addrArray = new Address[2]; // uComplex.addrArray[0] = new Address("Array 0 Xihu Hangzhou China", uComplex); // uComplex.addrArray[1] = new Address("Array 1 Xihu Hangzhou China", uComplex); //stack // uComplex.addrIds = new Stack<Long>(); // uComplex.addrArray[0] = new Address("Array 0 Xihu Hangzhou China", uComplex); // uComplex.addrArray[1] = new Address("Array 1 Xihu Hangzhou China", uComplex); System.out.println(uComplex); System.out.println(uAlice); System.out.println(uMax); System.out.println(uMin); } }