создать новую базу данных sqlite за другой - PullRequest
0 голосов
/ 19 сентября 2018

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

public static final File sdcard = new File(Environment.getExternalStorageDirectory() + "/memoryplus");
public static final File DB_NAME = new File(sdcard.getAbsolutePath() + File.separator + MainActivity.dbName + ".db");

Button btnAdd = (Button)dlc.findViewById(R.id.button);
            btnAdd.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    dbName=ed.getText().toString();

                    myDb=new MyDatabase(getApplicationContext());
                    boolean result= myDb.insertData(null,null);

                    FilesInFolder.clear();
                    Adapter.clear();
                    RefreshListView();
                    ed.setText("");

                    myDb.close();

                    dlc.dismiss();


                }
            });

1 Ответ

0 голосов
/ 19 сентября 2018

Вы можете иметь несколько баз данных и открывать их одновременно.

Вот пример, который создает (и открывает) 20 баз данных, а затем перечисляет в них таблицы (1 таблица, добавленная в каждую).

Он создает / открывает 10 с помощью Database Helper (то есть подкласс класса SQLiteOpenHelper) и 10 без использования DatbaseHelper .

Таким образом, он имеет 20 одновременно открытых баз данных.

DBHelper.java Помощник по базам данных: -

public class DBHelper extends SQLiteOpenHelper {

    public static final int DBVERSION = 1;
    public static final String TB_MYTABLE = "mytable";
    public static final String MYTABLE_COL_ID = BaseColumns._ID;
    public static final String MYTABLE_COL_NAME = "_name";
    public static final String MYTABLE_COL_EMAIL = "_email";
    public static final String MYTABLE_COL_PASSWORD = "_password";

    static final String crtsql = "CREATE TABLE IF NOT EXISTS " + TB_MYTABLE + "(" +
            MYTABLE_COL_ID + " INTEGER PRIMARY KEY, " +
            MYTABLE_COL_NAME + " TEXT, " +
            MYTABLE_COL_EMAIL + " TEXT UNIQUE, " +
            MYTABLE_COL_PASSWORD + " TEXT " +
            ")";

    SQLiteDatabase mDB;

    public DBHelper(Context context, String name) {
        super(context, name, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

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

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    }

    public void logTables() {
        Cursor csr = mDB.query("sqlite_master",null,null,null,null,null,null);
        while (csr.moveToNext()) {
            Log.d("DBHLPRTABLES",csr.getString(csr.getColumnIndex("name")));
        }
        csr.close();
    }
}

MainActivity.java Активность вызова / использования: -

public class MainActivity extends AppCompatActivity {


    ArrayList<SQLiteDatabase> mDatabaseList;
    ArrayList<DBHelper> mDBHelperList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDatabaseList = new ArrayList<>();
        mDBHelperList = new ArrayList<>();


        for (int i=0;i < 10; i++) {
            mDatabaseList.add(createSQLiteDatabase("mydb" + String.valueOf(i)));
            mDBHelperList.add(new DBHelper(this, "dbmine" + String.valueOf(i)));
        }
        for (SQLiteDatabase db: mDatabaseList) {
            Cursor csr = db.query("sqlite_master",null,null,null,null,null,null);
            while (csr.moveToNext()) {
                Log.d("TABLES",csr.getString(csr.getColumnIndex("name")));
            }
        }

        for (DBHelper dbhlpr: mDBHelperList) {
            dbhlpr.logTables();
        }
    }

    private SQLiteDatabase createSQLiteDatabase(String dbname) {
        File dbpath = getDatabasePath(dbname);
        File dir = new File(dbpath.getParent());
        if (!dir.exists()) {
            dir.mkdirs();
        }
        SQLiteDatabase db =  SQLiteDatabase.openOrCreateDatabase(dbpath,null);
        db.execSQL("CREATE TABLE IF NOT EXISTS mytable (ID INTEGER PRIMARY KEY, mycolumn TEXT)");
        return db;
    }
}
  • Это повторяется 10 раз.Для каждого цикла он

    • Открывает или создает базу данных mydb ?(где? = 0, затем 1 ..... 9) добавление объекта SQliteDatabase в mDatabaseList ArrayList.
    • Создание экземпляра DBHelper класс с именем базы данных dbmine ?(где? = 0, затем 1 ..... 9) (который эффективно открывает или создает базу данных из-за mDB = this.getWritableDatabase();), экземпляр DBHelper добавляется к mDBHelperList ArrayList.
  • Затем выполняется цикл по mDatabaseList (10 баз данных), в котором выполняется запрос к каждой из них, в которой перечислены имена из sqlite_master таблица.

  • Затем он делает то же самое для mDBHelperList (вызывает метод logTables).

Device Explorer показывает: -

enter image description here

Показывает журнал: -

09-19 22:06:49.503 1820-1820/? D/TABLES: android_metadata
    mytable
    android_metadata
    mytable
    android_metadata
    mytable
09-19 22:06:49.507 1820-1820/? D/TABLES: android_metadata
    mytable
    android_metadata
    mytable
    android_metadata
    mytable
    android_metadata
    mytable
    android_metadata
    mytable
    android_metadata
    mytable
    android_metadata
    mytable
09-19 22:06:49.507 1820-1820/? D/DBHLPRTABLES: android_metadata
    mytable
    sqlite_autoindex_mytable_1
09-19 22:06:49.511 1820-1820/? D/DBHLPRTABLES: android_metadata
    mytable
    sqlite_autoindex_mytable_1
    android_metadata
    mytable
    sqlite_autoindex_mytable_1
    android_metadata
    mytable
    sqlite_autoindex_mytable_1
    android_metadata
    mytable
    sqlite_autoindex_mytable_1
    android_metadata
    mytable
    sqlite_autoindex_mytable_1
    android_metadata
    mytable
    sqlite_autoindex_mytable_1
    android_metadata
    mytable
    sqlite_autoindex_mytable_1
    android_metadata
    mytable
    sqlite_autoindex_mytable_1
09-19 22:06:49.519 1820-1820/? D/DBHLPRTABLES: android_metadata
    mytable
    sqlite_autoindex_mytable_1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...