无法在 android studio SQLite 数据库中动态创建多个表

Posted

技术标签:

【中文标题】无法在 android studio SQLite 数据库中动态创建多个表【英文标题】:Can't create more than one table dynamically in android studio SQLite database 【发布时间】: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 中的循环只运行一次。 我已经编辑了我的问题 只有一个数据库还是只有一个表 同一个数据库需要创建多个表。以上代码现在只创建一个表 【参考方案1】:

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

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

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

【讨论】:

以上是关于无法在 android studio SQLite 数据库中动态创建多个表的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio - SQLite 插入冻结

在Android Studio中查看Sqlite的方法

使用 SQL/SQLite 工具箱 Visual Studio 2019 在 SQLite 数据库和 Xamarin.Android 项目之间建立连接

在 android studio 中使用 SQLite 显示上次登录的用户数据

如何在 android studio 中使用 sqlite 为特定帐户创建表?

Android Studio - 线程完成后从 SQLite 获取数据