2014-11-16 7 views
0

У меня есть вопрос относительно обработки баз данных SQLite в Android.Представление базы данных SQLite

Я программирую приложение, которое выполняет некоторую передачу данных из базы данных SQLite. Эти приложения состоят из одного действия, которому принадлежат серверные фрагменты. Эти фрагменты предлагают различные инструменты для построения и управления данными и взаимодействия через интерфейсы.

Мне также нужен один или несколько классов для представления моей базы данных и предложения функций CRUD.

Но теперь я не знаю, где реализовать эти классы. Производит ли каждый фрагмент свой собственный класс, или я должен помещать его в центр моей деятельности и предлагать функции CRUD через интерфейсы? Я бы сделал это с интерфейсами, но так как я никогда не делал что-то с Android, я не уверен.

Есть ли рекомендуемый способ или образец для этого случая?

ответ

0

Лучше всего было бы использовать эту активность для обработки операций с базой данных и записи/чтения, а также чтобы ваши фрагменты обменивались данными с действиями (это рекомендуется Google в любом случае). Вы DBOpenHelper могли бы выглядеть примерно так:

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

/** 
* Created by Dev Paul 
*/ 
public class DataBaseOpenHelper extends SQLiteOpenHelper { 



    // Logcat tag 
    private static final String LOG = "DatabaseHelper"; 

// Database Version 
private static final int DATABASE_VERSION = 1; 

// Database Name 
private static final String DATABASE_NAME = "contactsManager"; 

//Table Names 
public static final String REPS_TABLE = "repsTable"; 


//Reps Table Columns 
public static final String R_COLUMN_ID = "repId"; 
public static final String R_COLUMN_STRING_DATA = "repStringData"; 
public static final String R_COLUMN_GOOD_FORM = "repGoodForm"; 

/** 
* Table create statements for the reps objects. 
*/ 
private static final String CREATE_REPS_TABLE = "CREATE TABLE " 
     + REPS_TABLE + " (" + R_COLUMN_ID + " INTEGER, " 
     + R_COLUMN_STRING_DATA + " TEXT, " 
     + R_COLUMN_GOOD_FORM + " INTEGER " + ")"; 
/** 
* Default constructor. 
* @param context from the calling activity. 
*/ 
public DataBaseOpenHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(CREATE_REPS_TABLE); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    //drop the tables if they exist. 
    db.execSQL("DROP TABLE IF EXISTS " + REPS_TABLE); 
    // create new tables 
    onCreate(db); 
} 
} 

Это является частью одного из моих приложений, которые я работаю, и, в конечном счете, вероятно, будет с открытым исходным кодом в любом случае. Тогда ваш класс DataSource может выглядеть примерно так ...

/** 
* Created by Dev Paul 
*/ 
public class DataSource { 

private Context mContext; 
private DataBaseOpenHelper dataBaseOpenHelper; 
private SQLiteDatabase db; 
private boolean isOpened; 

/** 
* Class that helps with obtaining data from the data base. This should do all interfacing to 
* the data base. No calls should be directly made to {@code DataBaseOpenHelper}. 
* @param context the context of the calling activity. 
*/ 
public DataSource(Context context) { 
    this.mContext = context; 
    dataBaseOpenHelper = new DataBaseOpenHelper(context); 
} 

/** 
* Checks to see if the database has been openned. 
* @return 
*/ 
public boolean isOpened() { 
    return isOpened; 
} 

/** 
* Get a writeable database. This must be called. 
*/ 
public void open() { 
    db = dataBaseOpenHelper.getWritableDatabase(); 
    isOpened = true; 
} 

/** 
* Close the database. This must be called. 
*/ 
public void close() { 
    dataBaseOpenHelper.close(); 
    isOpened = false; 
} 

    //handle getting and creating data methods.... 
} 

Тогда вам просто нужно обрабатывать получение установки данных с помощью операторов запросов с правильным синтаксисом SQL. Поэтому в вашей деятельности вам просто нужно создать новый объект DataSource и вызвать dataSource.open(), чтобы открыть базу данных. Затем в вашем методе onDestroy() вашей деятельности вызовите dataSource.close(), чтобы вы не пропускали какие-либо элементы.

1

Вы можете просто сохранить один экземпляр вашего SQLiteOpenHelper и использовать его в своих фрагментах, где бы вы ни захотели.

Пример Singleton рекомендуется для приложений, ориентированных на данные. Даже если у вас несколько потоков, работающих на одном экземпляре базы данных, вам не нужно беспокоиться о синхронизации. Поскольку у вас есть один экземпляр SQLiteOpenHelper, вы внутренне поддерживаете один экземпляр объекта SQLiteDatabase, и он является потокобезопасным.

Вы упомянули о нескольких фрагментах внутри действия (не упоминается о потоке, используемом для обработки данных). Поэтому я хотел бы добавить этот аспект. Лучше выполнять операции с данными в фоновых потоках. Когда каждый фрагмент выполняет некоторую обработку данных - настоятельно рекомендуется делать в фоновом потоке, чтобы избежать блокировки интерфейса/основного потока.

Чтобы лучше организовать код, создайте слой DAO.

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