【问题标题】:creating db table with foreign key ANDROID使用外键 ANDROID 创建数据库表
【发布时间】:2016-08-26 18:29:03
【问题描述】:

我正在尝试创建一个(目前)有 4 个表 {USERS,TOPICS,GROUPS,CREATED_TOPICS} 的数据库。当我尝试运行它时,我不断收到此错误...

语法错误(代码 1):,编译时:创建表 created_topics_table (CREATED_TOPIC_ID INTEGER PRIMARY KEY AUTOINCREMENT,TOPIC_ID INTEGER,USER_ID INTEGER,外键(TOPIC_ID) REFERENCES topic_table(_ID), FOREIGN KEY(USER_ID) REFERENCES users_table(_ID)。

这是代码...

public class databaseHelper extends SQLiteOpenHelper
{
//DATABASE NAME
public static final String DATABASE_NAME = "users.db";
//USERS TABLE
public static final String TABLE_NAME_USERS = "users_table";
public static final String COL_USER_ID = "_ID";
public static final String COL_USER_NAME = "USER_NAME";
public static final String COL_USER_EMAIL = "USER_EMAIL";
public static final String COL_USER_PASSWORD = "USER_PASSWORD";
//TOPICS TABLE
public static final String TABLE_NAME_TOPICS = "topics_table";
public static final String COL_TOPIC_ID = "_ID";
public static final String COL_TOPIC_NAME = "TOPIC_NAME";


//GROUPS TABLE
public static final String TABLE_NAME_GROUPS = "groups_table";
public static final String COL_GROUP_ID = "GROUP_ID";
public static final String COL_GROUP_NAME = "GROUP_NAME";

public static final String TABLE_NAME_CREATED_TOPICS =
"created_topics_table";
public static final String COL_CREATED_TOPIC_ID = "CREATED_TOPIC_ID";
public static final String COL_FK_TOPIC_TOPIC_ID = "TOPIC_ID";
public static final String COL_FK_TOPIC_USER_ID = "USER_ID";

public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME_USERS + " (_ID INTEGER PRIMARY KEY   
AUTOINCREMENT,USER_NAME TEXT,USER_EMAIL TEXT,USER_PASSWORD TEXT)");
db.execSQL("create table " + TABLE_NAME_TOPICS + " (_ID INTEGER PRIMARY KEY     
AUTOINCREMENT,TOPIC_NAME TEXT)");
db.execSQL("create table " + TABLE_NAME_GROUPS + " (GROUPS_ID INTEGER PRIMARY    
KEY AUTOINCREMENT,GROUP_NAME TEXT)");
db.execSQL("create table " + TABLE_NAME_CREATED_TOPICS + " (CREATED_TOPIC_ID 
INTEGER PRIMARY KEY AUTOINCREMENT, TOPIC_ID INTEGER,USER_ID INTEGER, FOREIGN
KEY(TOPIC_ID) REFERENCES " +TABLE_NAME_TOPICS + "(_ID)," +                                                                                                                                                            
"FOREIGN KEY(USER_ID) REFERENCES " +TABLE_NAME_USERS + "(_ID)");
}

【问题讨论】:

  • 您使用的是哪个数据库? AUTOINCREMENT 不应该是 AUTO_INCREMENT 吗?
  • AUTOINCREMENT 有效,不需要下划线,我只是在 sqlite db 中使用 bulit

标签: android sqlite


【解决方案1】:

你错过了最后的右括号:

create table created_topics_table (CREATED_TOPIC_ID INTEGER PRIMARY KEY AUTOINCREMENT, TOPIC_ID INTEGER,USER_ID INTEGER, FOREIGN KEY(TOPIC_ID) REFERENCES topics_table(_ID),FOREIGN KEY (USER_ID) REFERENCES users_table(_ID))

关于 sqlite 外键的另一个说明。默认情况下它们是关闭的。每次打开数据库连接都需要使用"PRAGMA foreign_keys=ON"

编辑

变化:

db.execSQL("create table " + TABLE_NAME_CREATED_TOPICS + " (CREATED_TOPIC_ID 
INTEGER PRIMARY KEY AUTOINCREMENT, TOPIC_ID INTEGER,USER_ID INTEGER, FOREIGN
KEY (TOPIC_ID) REFERENCES " +TABLE_NAME_TOPICS + " (_ID)," +                                                                    
"FOREIGN KEY (USER_ID) REFERENCES " +TABLE_NAME_USERS + " (_ID))");

【讨论】:

  • 如何设置 PRAGMA foreign_keys = ON?我得到一个无法解析符号'PRAGMA'...有什么例子吗?
  • db.execSQL("PRAGMA foreign_keys=ON");
  • 一切运行良好,但是当我运行查询以显示表中的一些数据时,它说没有这样的表:TABLE_NAME_CREATED_TOPICS。任何想法?非常感谢您的帮助。
  • @luke 由于您的 SQL 语句中的语法错误,您的表没有被创建。我纠正了这一点。请参阅答案的编辑部分
  • @luke 在任何数据库操作之前使用下面的函数私有 SQLiteDatabase 数据库;公共 SQLiteDatabase openDataBase(DatabaseHelper db) { if(db.isOpen()){ dataBase.execSQL("PRAGMA foreign_keys=ON;");返回数据库; } 数据库 = db.getWritableDatabase(); dataBase.execSQL("PRAGMA foreign_keys=ON;");返回数据库; }
【解决方案2】:

FOREIGN KEY(TOPIC_ID) REFERENCES topics_table(_ID),FOREIGN KEY(USER_ID) 之间添加一个空格

(CREATED_TOPIC_ID INTEGER PRIMARY KEY AUTOINCREMENT, TOPIC_ID INTEGER,USER_ID INTEGER, FOREIGN KEY(TOPIC_ID) REFERENCES topics_table(_ID), FOREIGN KEY(USER_ID) REFERENCES users_table(_ID)

使用这个希望它会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2017-08-16
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多