【问题标题】:Can't create more than one table dynamically in android studio SQLite database无法在 android studio SQLite 数据库中动态创建多个表
【发布时间】:2021-09-19 22:01:41
【问题描述】:

我正在尝试在 android studio SQLite 数据库中动态创建多个表。我在下面附上了两个类 DatabaseHelper.javaDatabaseManager.java 的代码。通过运行以下代码,只创建了一个表。

DatabaseHelper.java

package com.example.circle;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class DatabaseHelper extends SQLiteOpenHelper {


    static final String DATABASE_NAME = "MY__2MESS11AGES.DB";
    public static String TABLE_NAME;
    public static String ID = "ID";
    public static String MESSAGE_ID = "MESSAGE_ID";
    public static String TIME_STAMP = "TIME_STAMP";
    public static String MESSAGE = "MESSAGE";
    public static String MESSAGE_STATUS = "MESSAGE_STATUS";
    public static String VIEW_TYPE = "VIEW_TYPE";


    public DatabaseHelper(Context context,String table_name) {
        super(context, DATABASE_NAME, null, 1);
        TABLE_NAME = table_name;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME +"(ID INTEGER PRIMARY KEY AUTOINCREMENT,MESSAGE_ID TEXT,TIME_STAMP TEXT,MESSAGE TEXT,MESSAGE_STATUS TEXT NOT NULL,VIEW_TYPE TEXT)");
    }

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

    }
}

DatabaseManager.java

package com.example.circle;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DatabaseManager {

    private DatabaseHelper databaseHelper;
    private Context context;
    private SQLiteDatabase database;

    public DatabaseManager(Context context) {
        this.context = context;
    }

    public DatabaseManager open(String tableName) {
        System.out.println("DATA BASE MANAGER =================="+ tableName);
        databaseHelper = new DatabaseHelper(context, tableName);
        database = databaseHelper.getWritableDatabase();
        return this;
    }

    public void insert(String tableName, String messageId, String timeStamp, String message, String messageStatus, String viewType) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.MESSAGE, message);
        contentValues.put(DatabaseHelper.MESSAGE_ID, messageId);
        contentValues.put(DatabaseHelper.TIME_STAMP, timeStamp);
        contentValues.put(DatabaseHelper.MESSAGE_STATUS, messageStatus);
        contentValues.put(DatabaseHelper.VIEW_TYPE, viewType);
        database.insert(tableName, null, contentValues);
    }

    public Cursor fetch(String table_name) {
        String[] columns = new String[]{DatabaseHelper.ID, DatabaseHelper.MESSAGE_ID, DatabaseHelper.MESSAGE, DatabaseHelper.TIME_STAMP, DatabaseHelper.MESSAGE_STATUS, DatabaseHelper.VIEW_TYPE};
        Cursor cursor = database.query(table_name, columns, null, null, null, null, null);
        if (cursor != null) {
            cursor.moveToFirst();
        }
        return cursor;
    }

    public int update(String messageId, String tableName,String messageStatus){
        ContentValues contentValues = new ContentValues();
        contentValues.put(DatabaseHelper.MESSAGE_STATUS,messageStatus);
        int ret = database.update(tableName,contentValues,DatabaseHelper.MESSAGE_ID + "=" + messageId,null);
        return ret;
    }

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

这就是我在 MainActivity.java

中调用 DatabaseManager.java 的构造函数的方式
DatabaseManager databaseManager = new DatabaseManager(this);
String[]  tableName = {"sun", "moon", "one", "two", "four", "three", "five"}; //Name of the tables
 for(int i = 0 ;i<tableName.length ; i++){
        databaseManager.open(  tableName[i]);
        databaseManager.close();
}



【问题讨论】:

  • 不清楚变量 jabberId 来自哪里。由于您共享的代码中没有指定它的值,我假设它的长度为零,因此您在 MainActivity 中的循环只运行一次。
  • 我已经编辑了我的问题
  • 只有一个数据库还是只有一个表
  • 同一个数据库需要创建多个表。以上代码现在只创建一个表

标签: android sqlite android-studio android-sqlite


【解决方案1】:

根据文档,onCreate 仅在最初创建数据库时运行一次:

https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)

因此它只运行一个创建表查询。将带有表名的循环放在 onCreate() 方法中会更有意义。

【讨论】:

    猜你喜欢
    • 2014-11-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多