2017-08-30 5 views
0

すべてがうまくいきます。私はデータベースサイズが増加しているアプリケーションを構築しています。 IncreaseData,Tables 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は入れて、私はイライラ作っています。ダイナミクスはどこですか? *

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; 
} 

このような状況に他の方法かもしれない何?モデルは でcontentValuesを作成する必要がありますか?または、他のアーキテクチャ に従うべきですか? ORMを使用したくありません

答えて

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

アンドロイドのSQLite DB構造の場合は、通常BoD Content provider generatorを使用します。あなたのテーブルの列のjson値を渡すだけで、あなたのためのコンテンツプロバイダクラスが自動的に生成されます。新しいテーブルごとに別々のコンテンツプロバイダを用意することができ、コードをより効率的にすることができます。

さらに、コマンドラインコマンドを使用して、グラデルファイルに何もインポートせずに構造を生成することができます。あなたが必要とするすべての構文情報が含まれているリンクを参照してください。ありがとう。