2011-12-20 1 views
0

У меня этот класс, который создает базу данных при первом запуске приложения. Я хотел заполнить одну таблицу некоторыми примерами значений из strings.xml. В основном я хотел бы сделать это как:Создание значений примера в базе данных SQLite с использованием строк из strings.xml

private static final String CATEGORIES_FILL = "INSERT INTO categories VALUES ('', " + getString(R.string.fuel) + "); " + 
               "INSERT INTO categories VALUES ('', " + getString(R.string.food) + "); " + 
               "INSERT INTO categories VALUES ('', " + getString(R.string.treatment) + "); " + 
               "INSERT INTO categories VALUES ('', " + getString(R.string.salary) + "); "; 

Проблема заключается в том, класс не является деятельностью, и строка должна быть статичной, так что я могу использовать

db.execSQL(CATEGORIES_FILL); 

Пожалуйста, исправьте мой подход, так что я мог бы использовать strings.xml, чтобы сделать это.

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

Фрагмент класса базы данных

private static class DatabaseHelper extends SQLiteOpenHelper { 


    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 


     final String CATEGORIES_FILL = "INSERT INTO categories VALUES ('', " + context.getString(R.string.fuel) + "); " + 
     "INSERT INTO categories VALUES ('', " + context.getString(R.string.food) + "); " + 
     "INSERT INTO categories VALUES ('', " + context.getString(R.string.treatment) + "); " + 
     "INSERT INTO categories VALUES ('', " + context.getString(R.string.salary) + "); "; 
    } 

    /* Tworzenie tabel 
    * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase) 
    */ 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(DATABASE_CREATE); 
     db.execSQL(CATEGORIES_FILL); //need the way to access this final here 
     db.execSQL(EXPENSES_CREATE); 
     db.execSQL(INCOMES_CREATE); 
     db.execSQL(BUGS_CREATE);    
    } 

ответ

2

Что-то смутно, как это.

Добавить в разрешении/значения/ <yourchoiceoffilename> .xml & добавьте строку ссылки на строки массива.

<resources> 
    <string-array name="categories"> 
     <item>@string/fuel</item> 
     <item>@string/food</item> 
     <item>@string/treatment</item> 
     <item>@string/salary</item> 
    </string-array> 
</resources> 

Создайте SQLiteStatement в своей базе данных.

SQLiteDatabase db = ...; 
SQLiteStatement insert = db.compileStatement("INSERT INTO categories (yourcolumnnamehere) VALUES (?)"); 

//process each string 
for (String category : getResources().getStringArray(R.array.categories)) 
{ 
    insert.bindValue(1, category); 
    long id = insert.executeInsert(); // In case you care about the row id. 
} 

Edit: И, рассмотреть возможность сделать что-то как следуя к классу (я, вероятно, оставил ошибку или два в там, но вы должны получить его суть):

private static class DatabaseHelper extends SQLiteOpenHelper { 
    ... 
    // Replace 'yourcolumnnamehere' with whatever your column is actually named. 
    private static final String INSERT_CATEGORY = "INSERT INTO categories (yourcolumnamehere) VALUES (?)" 
    ... 
    ... 

    private final String[] mCategories; 
    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mCategories = context.getResources().getStringArray(R.array.categories); 
    } 

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

     // Here you create the SQLiteStatement that will be used 
     // to add categories. The values are stored in mCategories. 
     SQLiteStatement statement = db.compileStatement(INSERT_CATEGORY); 
     for (String category : mCategories) { 
      statement.bindValue(1, category); 
      statement.executeInsert(); 
     } 
     statement.close(); 

     db.execSQL(EXPENSES_CREATE); 
     db.execSQL(INCOMES_CREATE); 
     db.execSQL(BUGS_CREATE);    
    } 
+0

, но я не могу использовать getResources, если класс не расширяет действие справа? И какой вклад в (?) Месте –

+1

Любой контекст сможет получить вам ресурсы. ? является заполнителем, используемым при привязке значений к предварительно скомпилированной инструкции SQLite. Где вы делаете это, так как у вас нет доступа к контексту. – Jens

+0

делать это в классе databaseadapter, где создаются базы данных, таблицы и прочее –

1
<string-array name="categories"> 
     <item>aaaaaa</item> 
     <item>bbbbbbbb</item> 
     <item>cccccccc</item> 
     <item>ddddd</item> 
</string-array> 

Вместо добавления строки, добавьте массив строк в string.xml Затем в Java восстановить его с помощью:

String[] categoriesAndDescriptions = getResources().getStringArray(R.array.categories); 
    for(String cad : categoriesAndDescriptions) { 
     String categoryAndDesc = cad; 
     list.add(categoryAndDesc); 
    } 

список ArrayList , после того, как вы получите одно значение, сохраните его в Arraylist.

Теперь Заполняем это ArayList для вставки запроса, вы можете получить первое значение с помощью list.get(0)

+0

GetResources также Context класс на основе. Я не могу использовать id в классе non-activity –

0

попробовать это

private Resources mResources; 

DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    mResources = context.getResources(); 

    final String CATEGORIES_FILL = "INSERT INTO categories VALUES ('', " + mResources.getString(R.string.fuel) + "); " + 
       "INSERT INTO categories VALUES ('', " + mResources.getString(R.string.food) + "); " + 
       "INSERT INTO categories VALUES ('', " + mResources.getString(R.string.treatment) + "); " + 
       "INSERT INTO categories VALUES ('', " + mResources.getString(R.string.salary) + "); "; 
      } 
Смежные вопросы