【问题标题】:Android SQLite ForeignKey Column not found in Database在数据库中找不到 Android SQLite ForeignKey 列
【发布时间】:2017-01-08 20:06:33
【问题描述】:

在程序成功运行并从 Android 设备监视器中提取 .db 文件后,我可以找到每个表的所有表和列,但 Foreign key 的列除外。有人知道为什么会这样吗?我的Query 有问题吗?这是我的代码:

 private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "datacollector.db";

private static final String Table_Survey = "SURVEY";
private static final String Survey_KEY_ID = "id";
private static final String Survey_KEY_NAME = "Survey_Name";
private static final String KEY_Table_Name = "Table_Name";


private static final String Table_formDetails = "FormDetails";
private static final String formDetails_KEY_ID = "id";
private static final String formDetails_field_Type="Field_Type";
private static final String formDetails_label = "Label";
private static final String formDetails_Options = "Options";

public DbHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {

    String CREATE_SURVEY_TABLE = "CREATE TABLE " + Table_Survey + "("
            + Survey_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + Survey_KEY_NAME + " VARCHAR(30),"
            + KEY_Table_Name + " VARCHAR(50)" + ")";
    db.execSQL(CREATE_SURVEY_TABLE);


    String CREATE_FORM_DETAILS_TABLE = "CREATE TABLE " + Table_formDetails + "("
            + formDetails_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + formDetails_field_Type + " VARCHAR(30),"
            + formDetails_Options + " VARCHAR(30),"
            + formDetails_label + " VARCHAR(30),"
            + " FOREIGN KEY ("+Survey_KEY_ID+") REFERENCES "+Table_Survey+"("+Survey_KEY_ID+"));";
    db.execSQL(CREATE_FORM_DETAILS_TABLE);



}

【问题讨论】:

    标签: android sqlite android-studio foreign-key-relationship android-database


    【解决方案1】:

    您正在将同一个表列映射到外键。现在试试这个。

     private static final int DATABASE_VERSION = 1;
     private static final String DATABASE_NAME = "datacollector.db";
    private static final String Table_Survey = "SURVEY";
    private static final String Survey_KEY_ID = "id";
    private static final String Survey_KEY_NAME = "Survey_Name";
    private static final String KEY_Table_Name = "Table_Name";
    private static final String Table_formDetails = "FormDetails";
    private static final String formDetails_KEY_ID = "id";
    private static final String formDetails_field_Type="Field_Type";
    private static final String formDetails_label = "Label";
    private static final String formDetails_Options = "Options";
    
    public DbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_SURVEY_TABLE = "CREATE TABLE " + Table_Survey + "("
                + Survey_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + Survey_KEY_NAME + " VARCHAR(30),"
                + KEY_Table_Name + " VARCHAR(50)" + ")";
        db.execSQL(CREATE_SURVEY_TABLE);
        String CREATE_FORM_DETAILS_TABLE = "CREATE TABLE " + Table_formDetails + "("
                + formDetails_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + formDetails_field_Type + " VARCHAR(30),"
                + formDetails_Options + " VARCHAR(30),"
                + formDetails_label + " VARCHAR(30),"
                 + forign_Survey_KEY_ID + "INTEGER DEFAULT 0,"
                + " FOREIGN KEY ("+forign_Survey_KEY_ID+") REFERENCES "+Table_Survey+"("+Survey_KEY_ID+"));";
        db.execSQL(CREATE_FORM_DETAILS_TABLE);
    }
    

    【讨论】:

    • forign_Survey_KEY_ID,你能解释一下这是什么吗?我这里出错了还是没有初始化?
    • 您需要有一列来存储超级表的 id,因此您必须创建一列来存储它们。我为您的错误编辑了代码,未初始化 .立即查看
    【解决方案2】:

    因为你没有在CREATE_FORM_DETAILS_TABLE中添加survey_key_id

    String CREATE_FORM_DETAILS_TABLE = "CREATE TABLE " + Table_formDetails + "("
                + formDetails_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + formDetails_field_Type + " VARCHAR(30),"
                + formDetails_Options + " VARCHAR(30),"
                + formDetails_label + " VARCHAR(30),"
                + Survey_KEY_ID + " INTEGER,"
                + " FOREIGN KEY ("+Survey_KEY_ID+") REFERENCES "+Table_Survey+"("+Survey_KEY_ID+"));";
        db.execSQL(CREATE_FORM_DETAILS_TABLE);
    

    【讨论】:

    • 出现错误“列名重复:id(代码 1):,编译时:CREATE TABLE FormDetails(id INTEGER PRIMARY KEY AUTOINCREMENT,Field_Type VARCHAR(30),Options VARCHAR(30),Label VARCHAR (30),id INTEGER, FOREIGN KEY (id) REFERENCES SURVEY(id));''
    • + Survey_KEY_ID + " INTEGER," 在此处和外键中更改名称 ("+Survey_KEY_ID+")
    • 只需更改声明 private static final String formDetails_KEY_ID = "id"; to private static final String formDetails_KEY_ID = "detail_id";
    猜你喜欢
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多