2014-09-16 2 views
0

У меня есть пять таблиц в моей базе данных. Они управляются классом DBHelper, который расширяет класс SQLiteOpenHelper. Поэтому этот класс заботится только для созданияОбычный способ доступа к базе данных в Android

базы данных и управления версиями

(http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html).

Мне нужно запрашивать, вставлять и изменять данные не только в одном действии, но и в нескольких. Я полагаю, что неслучайно выполнять SQL-запросы везде в вашем коде. Я хотя бы об инкапсуляции и создал класс, который предоставляет множество статических методов, которые возвращают или изменяют данные в базе данных. К настоящему времени этот класс слишком длинный.

Каков наилучший способ организации доступа к базе данных? Один класс для всех возможных операторов SQL? Или я ошибался, полагая, что разбросанные инструкции SQL во всем приложении не представляют собой хороший стиль кодирования?

Благодаря

+1

использовать пользовательские ContentProvider – pskink

+0

, но я не хочу, чтобы обмениваться данными с другими приложениями. – null

+0

Я знаю, сделайте его не экспортированным – pskink

ответ

0

Вы можете отделить код доступа к данным в отдельную сущность конкретных классов и эти классы в свою очередь, может использовать SQLiteOpenHelper Вы можете также определенные DAO (данные только классы) и для пути передачи данных между этими классами сущностей и классы бизнес-логики

0

Вот как я это делаю. Все в одном месте, и вам просто нужно сделать объект MyDatabase и вызывать любой метод, который вы хотите, из вашего кода. Обязательно прочитайте об обновлении, вставке и удалении (специальные обернутые запросы). Вы также можете выполнять сырые SQL-команды. Надеюсь, что я не был запутанным;)

public class MyDatabase { 

    public static final String DB_NAME = "myname.db"; 
    public static final int DB_VERSION = 1; 
    public static final String MY_TABLE = "my_table"; 

    public static final String E_IDD = "idd"; 
    public static final String E_FIELD1 = "f1"; 
    public static final String E_FIELD2 = "f3"; 
    public static final String E_FIELD3 = "f3"; 

    Context context; 
    MyDbHelper dbHelper; 
    SQLiteDatabase db; 

    public MyDatabase(Context context) { 
     this.context = context; 
     dbHelper = new MyDbHelper(); 
    } 


    public void insertSomeObject(Object obj) { 

     db = dbHelper.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 

     values.put(E_IDD, obj.getId()); 
     values.put(E_FIELD1, goal.getField1()); 
     values.put(E_FIELD2, goal.getField2()); 
     values.put(E_FIELD3, goal.getField3()); 


     db.insertWithOnConflict(MY_TABLE, null, values, 
       SQLiteDatabase.CONFLICT_IGNORE); 
    } 

    public void deleteObject(int id) { 
     db = dbHelper.getWritableDatabase(); 
     db.delete(MY_TABLE, E_IDD + "=?",new String[] {""+id }); 
    } 

    public Object fromCursor(Cursor c) { 
//carefull here to match the exact types you need for your object 
     Object obj = new Object(c.getInt(0), c.getInt(1), c.getString(2), c.getInt(3)) 

     return obj; 
    } 

    public ArrayList<Object> query() { 
     ArrayList<Object> objArray = new ArrayList<Object>(); 

     db = dbHelper.getReadableDatabase(); 

     Cursor cursor = db.query(MY_TABLE, null, null, null, null, null, 
       null); 

     if (cursor.getCount() <= 0) 
      return null; 

     cursor.moveToFirst(); 
     goalArray.add(fromCursor(cursor)); 
     while (cursor.moveToNext()) { 
      objArray.add(fromCursor(cursor)); 
     } 
     return objArray; 
    } 

    class MyDbHelper extends SQLiteOpenHelper { 

     public MyDbHelper() { 
      super(context, DB_NAME, null, 
        DB_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      String sql = String.format("create table %s " 
          + "(%s int primary key, " + "%s int, " + "%s text, " 
          + "%s int)", 
        MY_TABLE, E_IDD, E_FIELD1, E_FIELD2, E_FIELD3); 
      db.execSQL(sql); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("drop if exist " + MY_TABLE); 
      //or do something smarter 
      onCreate(db); 
     } 

    } 

} 
+0

Также, когда я пишу Object, я думаю, вам нужно написать свой собственный класс, чтобы быть вашей моделью данных, например: public class MyObjectForMyDB {int id; String field1, int field2 etc ...} –

+0

Спасибо, я посмотрю ваш подход. Но это выглядит хорошо! – null

+0

Прохладный, дайте мне знать, если это помогло :) И если вам нужна помощь. Ура! –

Смежные вопросы