无法在 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.java 和 DatabaseManager.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 数据库中动态创建多个表的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQL/SQLite 工具箱 Visual Studio 2019 在 SQLite 数据库和 Xamarin.Android 项目之间建立连接
在 android studio 中使用 SQLite 显示上次登录的用户数据