SQLiteOpenHelper, множественные таблицы и ContentProvider

Я пытаюсь синхронизировать данные между веб-сервером и приложением для Android. Итак, я следую этому замечательному совету: Синхронизация данных между приложением Android и веб-сервером

Теперь я фактически работаю над первой частью, занимаясь контент-провайдером. Для этого я нашел этот учебник: http://www.vogella.com/articles/AndroidSQLite/article.html

И в этом руководстве они предлагают вам сделать один SQLiteOpenHelper для каждой таблицы. У меня это работало нормально, но я понял, что это было немного странно, потому что у меня будет один файл для каждой таблицы.

Нравится:

public class AppUserDatabaseHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "appusertable.db";
private static final int DATABASE_VERSION = 1;

public AppUserDatabaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Method is called during creation of the database
@Override
public void onCreate(SQLiteDatabase database) {
    AppUserTable.onCreate(database);
}
}

Итак, я начал проводить некоторые исследования и выяснил следующее: Должен ли быть один SQLiteOpenHelper для каждой таблицы в базе данных? и, в частности, эта ссылка: http://blog.foxxtrot.net/2009/01/a-sqliteopenhelper-is-not-a-sqlitetablehelper.html , и это имеет для меня большой смысл.

Ну, моя проблема в том, что на самом деле также имеет смысл иметь один ContentProvider для каждой таблицы, потому что, если я этого не сделаю, это будет огромным и очень запутанным, но в каждом ContentProvider я фактически создаю базу данных:

public class AppUserContentProvider extends ContentProvider {     
@Override
public boolean onCreate() {
    database = new AppUserDatabaseHelper(getContext());
    return false;
}
}

И это также дает мне доступ к базе данных.

Итак, мой вопрос: мне просто нужно сделать гигантский ContentProvider для всех таблиц? или есть другой способ создать базу данных, которая должна быть разделена между каждым ContentProvider?

Я надеюсь, что вы можете мне помочь Спасибо за совет


person ginobilicl    schedule 04.10.2013    source источник
comment
Мне интересно, почему он предлагает иметь один SQLiteOpenHelper на таблицу. Как сделать запрос, когда вам нужно присоединиться, скажем, к двум или трем таблицам?   -  person Lawrence Choy    schedule 04.10.2013
comment
Я думал о том же самом. Я думаю, что большинство веб-руководств или примеров бесполезны, когда вам нужно сделать что-то по-настоящему. Практически невозможно иметь приложение с одной таблицей, и это не значит, что вам нужно повторять все, чтобы разобраться.   -  person ginobilicl    schedule 11.10.2013
comment
я думаю, что этот [сообщение] [1] поможет вам. [1]: stackoverflow.com /вопросы/13877701/   -  person telmo    schedule 02.05.2014


Ответы (1)


У вас должен быть другой поставщик контента для каждого ресурса, но используйте один sqlliteopenhelper (1 базу данных).

Есть несколько способов сделать это. То, что я делаю (что может быть не лучшим), использует пользовательский объект приложения в моем приложении (http://developer.android.com/reference/android/app/Application.html), у которого есть методы для доступа к объектам. Я хочу быть синглтоном, которому также нужен контекст. Это может быть не лучший способ, но он работает для меня.

e.g.

public class MainApplication extends Application {
    public static DatabaseHelper databaseHelper;
    public static Context applicationContext;


    @Override
    public void onCreate() {
        super.onCreate();
        databaseHelper = new DatabaseHelper(this);
        applicationContext = getApplicationContext();
    }

    @Override
    public void onTerminate() {
        databaseHelper.close();
        super.onTerminate();
    }

}

DatabaseHelper — это просто моя конкретная реализация SQLiteOpenHelper.

Определите пользовательский объект приложения в файле манифеста Android.

<application android:name="com.example.MainApplication" ...>
person Lionel Port    schedule 04.10.2013
comment
Прежде всего, спасибо за ваш ответ. Я очень сомневался в этом, и ваш ответ мне очень помог. Также я нашел конкретный пример для этого: ссылка Очень интересная статья. Привет - person ginobilicl; 11.10.2013