package com.litesuits.orm.samples; import android.os.Bundle; import android.os.Environment; 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.Person; import com.litesuits.orm.model.cascade.*; import com.litesuits.orm.test.SqliteUtils; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.ConcurrentLinkedQueue; public class CascadeTestActivity extends BaseActivity { public static final String SD_CARD = Environment.getExternalStorageDirectory().getAbsolutePath(); /** * 名字里包含路径符号"/"则将数据库建立到该路径下,可以使用sd卡路径。 * 不包含则在系统默认路径下创建DB文件。 */ public static final String DB_NAME = SD_CARD + "/lite/orm/cascade.db"; public static LiteOrm liteOrm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setSubTitile(getString(R.string.sub_title)); // Model Relation:school-(1,N)->classes-(1,1)->teacher-(N,N)->student-(1,N)->book // 数据持有关系:学校 -(1,N)-> 班级 -(1,1)-> 老师 -(N,N)-> 学生 -(1,N)-> 书籍 // 模拟数据 (1,N)一对多;(N,N)多对多;(N,1)多对一;(1,1)一对一 mockData(); if (liteOrm == null) { // 使用级联操作 DataBaseConfig config = new DataBaseConfig(this, DB_NAME); config.debugged = true; // open the log config.dbVersion = 1; // set database version config.onUpdateListener = null; // set database update listener liteOrm = LiteOrm.newCascadeInstance(config);// cascade } //DataBase db = LiteOrm.newCascadeInstance(this, "cascade.db"); //db.save(user); // 与非级联交叉使用: //db.cascade().save(user);//级联操作:保存[当前对象],以及该对象所有的[关联对象]以及它们的[映射关系],超贱! //db.single().save(user);//非级联操作:仅保存[当前对象],高效率。 } /** * <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(); // testMappingForNull(); 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: //SqliteUtils.testLargeScaleCascadeLiteOrm(liteOrm, 10000); // 注意 级联操作10万个数据将会相当耗时 testLargeScaleUseLite(); break; case 14: testLargeScaleUseSystem(); break; default: break; } } private void testMappingForNull() { School s = new School("A"); Classes c1 = new Classes("C1"); Classes c2 = new Classes("C2"); Classes c3 = new Classes("C3"); s.classesList = new ArrayList<Classes>(); s.classesList.add(c1); s.classesList.add(c2); s.classesList.add(c3); liteOrm.save(s); queryAndPrintAll(School.class); queryAndPrintAll(Classes.class); s.classesList = null; liteOrm.save(s); queryAndPrintAll(School.class); queryAndPrintAll(Classes.class); liteOrm.deleteAll(School.class); liteOrm.deleteAll(Classes.class); } private void testSave() { liteOrm.save(school); } private void testInsert() { liteOrm.insert(bookList); // 联合唯一测试 Book book1 = new Book("书:year和author联合唯一"); book1.setIndex(1988); book1.setAuthor("hehe"); Book book2 = new Book("和上一本冲突:year和author联合唯一"); book2.setIndex(1988); book2.setAuthor("hehe"); liteOrm.insert(book1); // 注意会报警告 liteOrm.insert(book2, ConflictAlgorithm.Abort); } private void testUpdate() { for (Book book : bookList) { int j = book.getIndex() % 3; if (j == 0) { book.setStudent(student2); } else if (j == 1) { book.setStudent(student1); } else if (j == 2) { book.setStudent(student0); } book.setIndex(book.getIndex() + 100); } liteOrm.update(bookList); } private void testUpdateColumn() { // 把所有书的author改为liter HashMap<String, Object> bookIdMap = new HashMap<String, Object>(); bookIdMap.put(Book.COL_AUTHOR, "liter"); liteOrm.update(bookList, new ColumnsValue(bookIdMap), ConflictAlgorithm.Fail); // 使用下面方式也可以 //liteOrm.update(bookList, new ColumnsValue(new String[]{Book.COL_AUTHOR}, // new String[]{"liter"}), ConflictAlgorithm.Fail); // 仅 author 这一列更新为该对象的最新值。 //liteOrm.update(bookList, new ColumnsValue(new String[]{Book.COL_AUTHOR}, null), ConflictAlgorithm.Fail); } private void testQueryAll() { queryAndPrintAll(Book.class); queryAndPrintAll(Student.class); queryAndPrintAll(Teacher.class); queryAndPrintAll(Classes.class); queryAndPrintAll(School.class); } private void testQueryByWhere() { List<Student> list = liteOrm.query(new QueryBuilder<Student>(Student.class) .where(Person.COL_NAME + " LIKE ?", new String[]{"%0"}) .whereAppendAnd() .whereAppend(Person.COL_NAME + " LIKE ?", new String[]{"%s%"})); OrmLog.i(TAG, list); } private void testQueryByID() { Student student = liteOrm.queryById(student1.getId(), Student.class); OrmLog.i(TAG, student); } private void testQueryAnyUwant() { List<Book> books = liteOrm.query(new QueryBuilder<Book>(Book.class) .columns(new String[]{"id", "author", Book.COL_INDEX}) .distinct(true) .whereGreaterThan("id", 0) .whereAppendAnd() .whereLessThan("id", 10000) .limit(6, 9) .appendOrderAscBy(Book.COL_INDEX)); OrmLog.i(TAG, books); } private void testMapping() { // 级联实例本来就保存了关系映射 queryAndPrintAll(School.class); } private void testDelete() { // 删除 student-0 liteOrm.delete(student0); } private void testDeleteByIndex() { // 按id升序,删除[2, size-1],结果:仅保留第一个和最后一个 // 最后一个参数可为null,默认按 id 升序排列 liteOrm.delete(Book.class, 2, bookList.size() - 1, "id"); } private void testDeleteByWhereBuilder() { // 删除 student-1 liteOrm.delete(new WhereBuilder(Student.class) .where(Person.COL_NAME + " LIKE ?", new String[]{"%1%"}) .and() .greaterThan("id", 0) .and() .lessThan("id", 10000)); } private void testDeleteAll() { // 连同其关联的classes,classes关联的其他对象一带删除 liteOrm.deleteAll(School.class); //liteOrm.deleteAll(Book.class); // 顺带测试:连库文件一起删掉 //liteOrm.deleteDatabase(); // 顺带测试:然后重建一个新库 //liteOrm.openOrCreateDatabase(); // 满血复活 } /** * 10000 条数据 */ final int MAX = 10000; /** * 注意 级联操作10万个数据将会相当耗时 */ private void testLargeScaleUseLite() { // LiteOrm 级联代码插入10w条数的效率测试 SqliteUtils.testLargeScaleUseLiteOrm(liteOrm, MAX); } private void testLargeScaleUseSystem() { // 原生android代码插入10w条数的效率测试 SqliteUtils.testLargeScaleUseDefault(CascadeTestActivity.this, MAX); } private void queryAndPrintAll(Class claxx) { List list = liteOrm.query(claxx); OrmLog.i(TAG, claxx.getSimpleName() + " : " + list); } protected static School school = null; protected static Classes classA; protected static Classes classB; protected static Teacher teacherA; protected static Teacher teacherB; protected static Student student0; protected static Student student1; protected static Student student2; protected static ArrayList<Book> bookList = new ArrayList<Book>(); private void mockData() { if (school != null) { return; } school = new School("US MIT"); classA = new Classes("class-a"); classB = new Classes("class-b"); //school:classes = 1:N school.classesList = new ArrayList<Classes>(); school.classesList.add(classA); school.classesList.add(classB); teacherA = new Teacher("teacher-a", 19); teacherB = new Teacher("teacher-b", 28); //classes:teacher = 1:1 classA.teacher = teacherA; classB.teacher = teacherB; student0 = new Student("student-0"); student1 = new Student("student-1"); student2 = new Student("student-2"); //teacher:student = N:N teacherA.setStudentLinkedQueue(new ConcurrentLinkedQueue<Student>()); teacherA.getStudentLinkedQueue().add(student0); teacherA.getStudentLinkedQueue().add(student1); teacherB.setStudentLinkedQueue(new ConcurrentLinkedQueue<Student>()); teacherB.getStudentLinkedQueue().add(student0); teacherB.getStudentLinkedQueue().add(student2); student0.setTeachersArray(new Teacher[]{teacherA, teacherB}); student1.setTeachersArray(new Teacher[]{teacherA}); student2.setTeachersArray(new Teacher[]{teacherB}); for (int i = 0; i < 30; i++) { Book book = new Book("book-" + i); book.setAuthor("autor" + i).setIndex(i); int j = i % 3; if (j == 0) { book.setStudent(student0); } else if (j == 1) { book.setStudent(student1); } else if (j == 2) { book.setStudent(student2); } bookList.add(book); } } @Override public String getMainTitle() { return getString(R.string.title_cascade); } @Override public String[] getButtonTexts() { return getResources().getStringArray(R.array.orm_test_case); } @Override public Runnable getButtonClickRunnable(final int id) { return new Runnable() { @Override public void run() { //Sub Thread makeOrmTest(id); } }; } }