Создание примеров значений в базе данных SQLite с использованием строк из strings.xml - PullRequest
0 голосов
/ 20 декабря 2011

Я получил этот класс, который создает базу данных при первом запуске приложения. Я хотел заполнить одну таблицу некоторыми примерами значений из 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);            
    }

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

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

Добавить в res / values ​​/ .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.
}

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

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);            
    }
1 голос
/ 20 декабря 2011
<string-array name="categories">
        <item>aaaaaa</item>
        <item>bbbbbbbb</item>
        <item>cccccccc</item>
        <item>ddddd</item>
</string-array>

Вместо добавления String добавьте строковый массив в 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 голосов
/ 22 января 2017

попробуйте

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) + "); "; 
            }
...