Доступ к базе данных в не-классе деятельности - PullRequest
5 голосов
/ 30 декабря 2010

У меня есть некоторый класс ( SomeClass.class ).Я хочу, чтобы в нем были некоторые статические методы, такие как getAllDatabaseItems , getTableItems, insertNewRecord и т. Д.

Если я делаю это таким образом

SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);
  • Iнеобходимо расширить Activity (но все еще не может использовать ее в статических методах) или передать переменную "db" в каждом отдельном методе (из "действия вызывающей стороны"), что довольно громоздко.

Что такоерешение, так что я могу из некоторого вызова класса SomeClass.getAllDatabaseItems () ?

@ MobileDev123 Так что мне все еще нужно расширить Activity (из-за метода openOrCreateDatabase)?Если у меня есть этот класс (который на самом деле не является деятельностью, я не использую его таким образом)

public class Partner extends Activity {
@SuppressWarnings("static-access")
public Partner(Context mContext) {
    myContext = mContext;
    db = openOrCreateDatabase(DATABASE_NAME, myContext.MODE_PRIVATE, null);

    db.execSQL("CREATE TABLE IF NOT EXISTS " + PARTNER_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + NAME + " VARCHAR);");
    db.execSQL("CREATE TABLE IF NOT EXISTS " + ADDRESS_TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, " + PARTNER_ID + " INT, " + ADDRESS + " VARCHAR, " + CITY + " VARCHAR);");
}

А затем вызывайте его из некоторых моих активностей, таких как

    Partner newPartner = new Partner(this);
    partnersItems = newPartner.getAllItems();

Я получаю ошибку NullExceptionError в строке 4 (Partner.class) - почему?Если я снова использую статическую ссылку на

MODE_PRIVATE => (Context.MODE_PRIVATE)

, она не работает.

@ Falmarri то же самое со статической, если я передаю аргумент "this" (от некоторого вызывающего абонента)class) и получить его в качестве аргумента Context в моем статическом методе до сих пор не может успешно создать / открыть мою базу данных (см. строки ранее)

Ответы [ 4 ]

4 голосов
/ 30 декабря 2010

Должно быть действие или служба, которая вызывает ваш класс, вы можете просто пройти this в удобное для вас время. (Я предпочитаю передавать это в конструкторе).

При получении руки используйте контекстный момент.

E.g Из класса MyActivity вы можете вызвать createDatabase(this) или new DataServices(this), но в классе DataServices тип аргумента должен быть context вместо MyActivity.

Теперь у вас есть параметр context, и вы можете использовать его по своему усмотрению, включая вызов openOrCreateDatabase().

Редактировать : Добавление кода

из Main.java

написать

DataBase database = new DataBase(this); //This will pass an instance of main. Which is eventually the subclass of Context.java

В классе DataBase : вам не нужно расширять действие там. В определении конструктора

public DataBase(Context context); // Если вы используете eclipse и полагаетесь на некоторые автоматизированные инструменты, вы можете увидеть что-то вроде Main main. Но используйте эти строки, чтобы вы могли вызывать их из любого вида деятельности или услуги, передав это.

определить поле класса Context и отнести его к контексту arg.

Нравится this.localContext= context;

И с помощью переменной localContext вы можете вызвать столбец openOrCreateDataBase.

ADDITION : Если к вам прикреплен какой-либо элемент управления (подкласс зрения), вы можете создать экземпляр DataBase, вызвав new DataBase(view.getContext());

Надеюсь, это поможет вам .... если вам понадобится дополнительная помощь, не стесняйтесь комментировать ниже.

0 голосов
/ 22 марта 2012

Вам не нужен контекст.Используйте статические методы SQLiteDatabase:

public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler)
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)
public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)

или:


public static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)
public static SQLiteDatabase openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)

0 голосов
/ 30 декабря 2010

Вам нужен контекст. Если вы хотите сделать это в статическом методе, он должен принимать в контексте

0 голосов
/ 30 декабря 2010

Я не уверен, что это можно сделать напрямую. Я сам боролся с этим, но каждое приложение использует свой дескриптор базы данных, поэтому Android нужно знать, как его получить (контекст), когда вы получаете дескриптор из этого ой такого удобного:

SQLiteDatabase db = (SQLiteDatabase)(new SQLOpenHelperDerivedClass(this)).getReadableDatabase();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...