SQLite — создание нескольких таблиц под одной и той же версией в Android

#android #sqlite

#Android #sqlite

Вопрос:

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

 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);
  

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

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

Ответ №1:

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

 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);
    }
}
  

Комментарии:

1. Конечно! Решение настолько простое, что оно не приходит мне в голову. Спасибо.