SQLite - Создание нескольких таблиц под одной версией в Android - PullRequest
1 голос
/ 08 октября 2011

Есть приложение, которому нужно создать несколько таблиц в БД. Я написал простую классную работу по работе с базой данных

package db.example.app;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;


public class DB {

    private final Map<String, String> FIELDS;

    private DatabaseHelper dbHelper;
    private SQLiteDatabase Db;

    private final String DB_NAME = "tasstelecom";
    private final String TABLE_NAME;

    private final int DATABASE_VERSION;
    private final String CREATE_TABLE;

    private final Context context;

    private class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
                super(context, DB_NAME, null, DATABASE_VERSION);
            }

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

        @Override
        public void onUpgrade(SQLiteDatabase db, int OldVerison, int newVersion) {

            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
             onCreate(db);
        }
    }

    public DB(Context ctx, String tableName, Map<String, String> fields, int version) {
        this.context = ctx;

        this.TABLE_NAME = tableName;
        this.FIELDS = fields;
        this.DATABASE_VERSION = version;

        String createFields = "";

        for(Map.Entry<String, String> m: FIELDS.entrySet()) {
            createFields += m.getKey().toString()+" "+m.getValue().toString()+", ";
        }

        createFields = createFields.replaceAll(",\\s$", "");

        this.CREATE_TABLE = "create table "+tableName+" (" + createFields+")";
    }

    public DB open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        Db = dbHelper.getWritableDatabase();

        return this;
    }

    public void close() {
        dbHelper.close();
    }

    public long insert(Map<String,String> vals) {
        ContentValues initialValues = new ContentValues();

        for(Map.Entry<String, String> m : vals.entrySet()) {
            initialValues.put(m.getKey(), m.getValue());
        }

        return Db.insert(TABLE_NAME, null, initialValues);
    }

    public Cursor executeQuery(String[] fieldsArray) {
        return Db.query(TABLE_NAME, fieldsArray, null, null, null, null, null);
    }

    public void backupDatabase() throws IOException {
        String inFileName = "/data/data/ru.ashot.tasstelecom/databases/"+DB_NAME;
        File dbFile = new File(inFileName);
        FileInputStream fis = new FileInputStream(dbFile);

        String outFileName = Environment.getExternalStorageDirectory()+"/"+DB_NAME+".sqlite";

        OutputStream output = new FileOutputStream(outFileName);

        byte[] buffer = new byte[1024];
        int length;
        while ((length = fis.read(buffer))>0){
            output.write(buffer, 0, length);
        }

        output.flush();
        output.close();
        fis.close();
    } }

вызов конструктора создает базу данных, если она не существует, и создает таблицу

table1 = new DB(this, "table1", fields1, 1);
table2 = new DB(this, "table2", fields1, 2);

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

Есть ли метод для создания нескольких таблиц с методом, описанным в одной и той же версии БД?

1 Ответ

1 голос
/ 08 октября 2011

Вам не нужно вызывать конструктор несколько раз, достаточно одного раза.Заменить:

private final String CREATE_TABLE;

На:

protected ArrayList<String> mSqlQueries = new ArrayList<String>();

И изменить это:

this.CREATE_TABLE = "create table "+tableName+" (" + createFields+")";

На:

String sql = "create table "+tableName+" (" + createFields+")";
mSqlQueries.add(sql);

И изменить onCreate следующим образом:

@Override
public void onCreate(SQLiteDatabase db) {
    for(String sql : mSqlQueries) {
            db.execSQL(sql);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...