我有一个包含6个表的数据库。这些表是在内容提供商和数据库助手的帮助下创建的。当我使用这6个表运行应用程序时,应用程序工作,所有表都被创建,我可以查询表并插入数据。
但是,当我尝试将sqlite视图添加到我的数据库助手的onCreate方法时,应用程序会崩溃。
据我所知,视图的onCreate方法是在视图的联接中使用的表onCreate方法之前被调用的,无论出于什么原因。
我需要知道的是如何强制我的数据库助手首先创建表,然后创建视图。
由于这个问题的性质(“视图”一词用于指代其他事物),我很难找到解决方案。
以下是创建视图的代码:
public static final String TABLE_NAME = "recent_listens";
public static final String TIMESTAMP_ID = timestampTable.TIMESTAMP_ID;
public static final String TRACK_NAME = trackTable.TRACK_NAME;
public static final String TRACK_MBID = trackTable.TRACK_MBID;
public static final String ALBUM_NAME = albumTable.ALBUM_NAME;
public static final String ALBUM_MBID = albumTable.ALBUM_MBID;
public static final String ARTIST_NAME = artistTable.ARTIST_NAME;
public static final String ARTIST_MBID = artistTable.ARTIST_MBID;
public static final String TIMESTAMP_VALUE = timestampTable.TIMESTAMP_VALUE;
public static final String IMAGE_ID = albumTable.ALBUM_IMG_ID;
private static final String LISTEN_VIEW_CREATE = ""
+ "CREATE VIEW " + TABLE_NAME + " AS "
+ "SELECT "
+ timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_ID + " AS " + TIMESTAMP_ID + ", "
+ trackTable.TRACK_NAME + " AS " + TRACK_NAME + ", "
+ trackTable.TRACK_MBID + " AS " + TRACK_MBID + ", "
+ albumTable.ALBUM_NAME + " AS " + ALBUM_NAME + ", "
+ albumTable.ALBUM_MBID + " AS " + ALBUM_MBID + ", "
+ artistTable.ARTIST_NAME + " AS " + ARTIST_NAME + ", "
+ artistTable.ARTIST_MBID + " AS " + ARTIST_MBID + ", "
+ timestampTable.TIMESTAMP_VALUE + " AS " + TIMESTAMP_VALUE + ", "
+ albumTable.ALBUM_IMG_ID + " AS " + IMAGE_ID
+ " FROM "
+ timestampTable.TABLE_TIMESTAMP
+ " INNER JOIN " + trackTable.TABLE_TRACK + " ON "
+ timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_TRACK_ID + " = "
+ trackTable.TABLE_TRACK + "." + trackTable.TRACK_ID
+ " INNER JOIN " + albumTable.TABLE_ALBUM + " ON "
+ timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_ALBUM_ID + " = "
+ albumTable.TABLE_ALBUM + "." + albumTable.ALBUM_ID;
public static synchronized void onCreate(SQLiteDatabase database) {
database.execSQL(LISTEN_VIEW_CREATE);
这就是我得到的错误:
引起:android.database.sqlite.SQLiteExcture:no这样的列:artist_name(代码1):,而编译:CREATE VIEWrecent_listensAS SELECTtimestamps_table_id_id,track_nametrack_name,track_mbidtrack_mbid,album_namealbum_name,album_mbidalbum_mbid,artist_nameartist_name,artist_mbidartist_mbid,时间戳作为时间戳,album_img_idalbum_img_id从timestamps_table内部连接轨道timestamps_table.track_id=轨道。_id内部连接相册timestamps_table.album_id=相册。_id
这是我的数据库助手类:
public class databaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "userData.db";
private static final int DATABASE_VERSION = 10;
public databaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database) {
artistTable.onCreate(database);
albumTable.onCreate(database);
trackTable.onCreate(database);
tagTable.onCreate(database);
similarTable.onCreate(database);
timestampTable.onCreate(database);
listenView.onCreate(database);
}
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
artistTable.onUpgrade(database, oldVersion, newVersion);
albumTable.onUpgrade(database, oldVersion, newVersion);
trackTable.onUpgrade(database, oldVersion, newVersion);
tagTable.onUpgrade(database, oldVersion, newVersion);
similarTable.onUpgrade(database, oldVersion, newVersion);
timestampTable.onUpgrade(database, oldVersion, newVersion);
listenView.onUpgrade(database, oldVersion, newVersion);
}
}
这是在我的自定义内容提供程序onCreate方法中调用的。
@Override
public boolean onCreate() {
database = new databaseHelper(getContext());
return false;
}
为了以防万一其他人会遇到同样的问题,我打算把这个留到一边。
事实证明,我在连接中没有包含select中提到的表。
生成的视图创建字符串如下:
private static final String LISTEN_VIEW_CREATE = ""
+ "CREATE VIEW " + TABLE_NAME + " AS "
+ "SELECT "
+ timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_ID + " AS " + LISTEN_ID + ", "
+ trackTable.TRACK_NAME + " AS " + TRACK_NAME + ", "
+ trackTable.TRACK_MBID + " AS " + TRACK_MBID + ", "
+ albumTable.ALBUM_NAME + " AS " + ALBUM_NAME + ", "
+ albumTable.ALBUM_MBID + " AS " + ALBUM_MBID + ", "
+ artistTable.ARTIST_NAME + " AS " + ARTIST_NAME + ", "
+ artistTable.ARTIST_MBID + " AS " + ARTIST_MBID + ", "
+ timestampTable.TIMESTAMP_VALUE + " AS " + TIMESTAMP_VALUE + ", "
+ albumTable.ALBUM_IMG_ID + " AS " + IMAGE_ID
+ " FROM "
+ timestampTable.TABLE_TIMESTAMP
+ " INNER JOIN " + trackTable.TABLE_TRACK + " ON "
+ timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_TRACK_ID + " = "
+ trackTable.TABLE_TRACK + "." + trackTable.TRACK_ID
+ " INNER JOIN " + albumTable.TABLE_ALBUM + " ON "
+ timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_ALBUM_ID + " = "
+ albumTable.TABLE_ALBUM + "." + albumTable.ALBUM_ID
+ " INNER JOIN " + artistTable.TABLE_ARTIST + " ON "
+ timestampTable.TABLE_TIMESTAMP + "." + timestampTable.TIMESTAMP_CON_ARTIST_ID + " = "
+ artistTable.TABLE_ARTIST + "." + artistTable.ARTIST_ID;
android.database.sqlite.SQLiteException: no such column: artist_name
这表明视图试图访问该表中不存在的列(我认为timestamps_表)。很可能是因为您添加了artist_name
表,忘记在onUpgrade()中增加数据库的新版本
修复方法:升级db的版本或卸载应用程序并再次运行,或从设置中清除应用程序的数据
CREATE USER 或 GROUP 语句 创建一个或更多的新用户或组。 语法 建立一个用户: CREATE USER 用户口令 pid [, 用户口令 pid, 匽 建立一个组: CREATE GROUP 组 pid[, 组 pid, 匽 CREATE INDEX 语句可分为以下几个部分: 部分 说明 用户 被加到工作组信息文件的用户名。 组 被加到工作组信息文件的组名。 口令 与特定用户名或
CREATE INDEX 语句用于在表中创建索引。 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。 索引 您可以在表中创建索引,以便更加快速高效地查询数据。 用户无法看到索引,它们只能被用来加速搜索/查询。 注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。 SQL CRE
SQL CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表。 表由行和列组成,每个表都必须有个表名。 SQL CREATE TABLE 语法CREATE TABLE table_name ( column_name1 data_type(size), column_name2 data_type(size), column_name3 data_type(size)
SQL CREATE DATABASE 语句 CREATE DATABASE 语句用于创建数据库。 SQL CREATE DATABASE 语法CREATE DATABASE dbname; SQL CREATE DATABASE 实例 下面的 SQL 语句创建一个名为 "my_db" 的数据库:CREATE DATABASE my_db; 数据库表可以通过 CREATE TABLE 语句来添加。
欢迎在这里提出任何建议。提前谢了。
CREATE INDEX 语句示例 此示例在员工表中创建家用电话字段的索引并且扩展员工表。 Sub CreateIndexX1() Dim dbs As Database ' 在您的计算机中修改此行使其正确指到 Northwind 的路径。 Set dbs = OpenDatabase("Northwind.mdb") ' 对运费超过 $100 的订单, '在员工表中创建 NewIndex 索引。