2017-08-30 119 views
0

希望一切都很好。我正在構建一個數據庫大小不斷增加的應用程序。 Increase根據DataTables and associated columns。我做了一個動態結構發送ModelsDatabaseHelper,但在DatabaseHelper我必須把代碼instanceOf作出適當的ContentValues。這讓我很煩惱。 Dynamic現在進入排序if else if當然我不想要。請參閱以下代碼片段以獲得更好的想法。SQLite數據庫訪問體系結構Android

*通用功能插入的人,也可能是老師或學生*

public void insertPersons(ArrayList<Person> persons) { 
    for(Person person : persons) { 
     insertOrUpdatePerson(person); 
    } 
} 

*這讓我惱火放的instanceof。 Dynamics現在在哪裏? *

public void insertOrUpdatePerson(Person person) { 
    if(person instanceof Teacher) 
     insertOrUpdateTeacher(person); 
    else { 
     ClassStudent student = (ClassStudent) person; 
     insertOrUpdateStudent(student); 
    } 
} 

public void insertOrUpdateStudent(ClassStudent student) { 
    try { 
     if(student.getPk_id() > 0) { 
      updateRecord(getWritableDatabase(), TABLE_STUDENT_DATA, createContentValues(student), student); 
     } else { 
      int row_id = insertRecord(getWritableDatabase(), TABLE_STUDENT_DATA, createContentValues(student), student); 
      student.setPk_id(row_id); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void insertOrUpdateTeacher(Person person) { 
    try { 
     Teacher teacher = (Teacher) person; 
     Cursor cursor = getWritableDatabase().rawQuery("SELECT * FROM " + TABLE_TEACHERS + " WHERE " + 
       teacher_id + " = " + teacher.getPerson_id(), null); 
     if(cursor != null && cursor.moveToFirst()) { 
      teacher.setPk_id(cursor.getInt(cursor.getColumnIndexOrThrow(pk_id))); 
     } 

     if(teacher.getPk_id() > 0) { 
      updateRecord(getWritableDatabase(), TABLE_TEACHERS, createContentValues(teacher), teacher); 
     } else { 
      int row_id = insertRecord(getWritableDatabase(), TABLE_TEACHERS, createContentValues(teacher), teacher); 
      teacher.setPk_id(row_id); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

*多個表和多個含量值,代碼是讓我感覺不好*

private ContentValues createContentValues(ClassStudent student) { 
    ContentValues cv = new ContentValues(); 

    cv.put(school_id, student.getSchool_id()); 
    cv.put(student_id, student.getPerson_id()); 

    return cv; 
} 

private ContentValues createContentValues(Teacher person) { 
    ContentValues cv = new ContentValues(); 

    cv.put(teacher_id, person.getPerson_id()); 
    cv.put(name, person.getPerson_name()); 

    return cv; 
} 

可能是什麼其他的方式來這樣的情況? Model應該是 負責製作contentValues嗎?或者我應該遵循什麼其他架構 ?我不想使用ORMs

回答

1

我建議你必須使用接口來解決這種情況。

使用insert()和getContentValues()創建接口並在Base類上實現它們。

實施例:

public interface PersonInterface { 

    void insert(ContentValues values); 
    void getContentValues(); 

} 

public class Person implements PersonInterface { 

    void insert(ContentValues values) {} 
    void getContentValues() {} 
} 

public class Teacher extends Person { 

    void insert(ContentValues values) { 
     // your Teacher record insert code goes here 
    } 
    void getContentValues() { 
     // return Teacher content values 
    } 
} 

public class Student extends Person { 

    void insert(ContentValues values) { 
     // your Student record insert code goes here 
    } 
    void getContentValues() { 
     // return Student content values 
    } 
} 

public class DBHelper { 

    public void insertPersons(ArrayList<Person> persons) { 
     for(Person person : persons) { 
     insertOrUpdatePerson(person); 
    } 

    public void insertOrUpdatePerson(Person person) { 
    person.insert(person.getContentValues()); 
    } 
} 
0

對於android中的SQLite數據庫結構,我通常使用BoD Content provider generator。它非常容易使用,只需傳遞表列的json值,它就會自動爲您生成一個內容提供者類。對於每個新表,您可以擁有獨立的內容提供者,這使得代碼更有效率。此外,您可以使用命令行命令生成結構,而無需在您的gradle文件中導入任何內容。請通過其中包含您需要的所有語法信息的鏈接。謝謝。