Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQLite 1:M关系_Java_Android_Sqlite_Android Sqlite - Fatal编程技术网

Java SQLite 1:M关系

Java SQLite 1:M关系,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,作为项目的一部分,我正在制作一款android应用程序,用于跟踪用户在健身房的锻炼情况。通过各种设置、重量和重复的训练和练习。这将建立一个1:M的关系,其中训练id是外键。我还不熟悉android和sqlite,所以我只想在继续之前检查一下下面的代码是否正确 如有任何建议,将不胜感激 数据库助手 public class DBHelper extends SQLiteOpenHelper { public static String DATABASE_NAME = "gym_db"; priv

作为项目的一部分,我正在制作一款android应用程序,用于跟踪用户在健身房的锻炼情况。通过各种设置、重量和重复的训练和练习。这将建立一个1:M的关系,其中训练id是外键。我还不熟悉android和sqlite,所以我只想在继续之前检查一下下面的代码是否正确

如有任何建议,将不胜感激

数据库助手

public class DBHelper extends SQLiteOpenHelper {

public static String DATABASE_NAME = "gym_db";
private static final int DATABASE_VERSION = 1;

public static final String TABLE_WORKOUT = "workout_table";
public static final String WORKOUT_ID = "_id";
public static final String WORKOUT_NAME = "workout_name";

public static final String TABLE_EXERCISE = "exercise_table";
public static final String EXERCISE_ID = "exercise_id";
public static final String EXERCISE_NAME = "exercise_name";
public static final String EXERCISE_SET = "exercise_set";
public static final String EXERCISE_WEIGHT = "exercise_weight";
public static final String EXERCISE_REP = "exercise_rep";

public static final String createWorkoutTable = "CREATE TABLE" + TABLE_WORKOUT + "("
        +WORKOUT_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + WORKOUT_NAME + " TEXT NOT NULL,"+
        ");";


public static final String createExerciseTable = " CREATE TABLE " + TABLE_EXERCISE + "("
        +EXERCISE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
        + EXERCISE_NAME + " TEXT NOT NULL, "
        + EXERCISE_SET + " INTEGER NOT NULL, "
        + EXERCISE_WEIGHT + " INTEGER NOT NULL, "
        + EXERCISE_REP + " INTEGER NOT NULL, "
        + WORKOUT_ID + "FOREIGN KEY"+
        "(;";
我还打开了onUpgrade方法中的外键

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    super.onOpen(db);
    if (!db.isReadOnly()){
        db.execSQL("PRAGMA foreign_keys=ON;");
    }
  • 编码
    训练ID+“外键”
    将不会产生所需的结果(假设这是外键约束)
  • 理论上(见下文),上述操作将创建一个名为\u id的列,列类型为外键(将转换为NUMERIC)。但是,由于
    FOREIGN
    是一个关键字,因此设置列类型的尝试将失败,并出现语法错误。您需要指定一个可能是
    INTEGER
    的列类型。因此,您将拥有
    训练ID
    +“整数…”

    但是,它本身的
    外键
    是不够的,而且位置也不正确。 定义
    外键有两种方法,作为列定义的一部分或作为表定义的一部分

    前者(列定义)不使用
    外键
    关键字,但缺少第二部分
    引用
    (即说明主表和引用列的内容),使用此方法,您将使用:-

    WORKOUT_ID + " INTEGER REFERENCES " + TABLE_WORKOUT +"(" + WORKOUT_ID +")"
    
    后者(表定义)使用外键关键字。您可以按照以下方式对其进行编码:-

    WORKOUT_ID + " INTEGER, FOREIGN KEY (" + WORKOUT_ ID + ") REFERENCES " + TABLE_WORKOUT + "(" + WORKOUT_ID + ")"
    
    • 你可能想看看

  • 下一行
    ”(;“
    将导致语法错误,应该是
    ”;“
  • 我还建议使用
    \u id
    作为引用
    \u id
    列的列的名称可能会导致混淆和困难(例如,当您使用联接进行选择时,结果光标中会有两列
    \u id

    我建议使用不同的列名,例如锻炼\u id\u参考

    • 这将详细介绍这个场景

    是否存在需要帮助的特定错误?否,我只是检查是否使用了正确的语法来创建表欢迎使用SO。这不是一个代码审查网站。好的,关于我可以通过加入的练习选择训练的查询,你有什么想法吗?我建议你先阅读帮助中心,这样你就可以对这个网站的用途有一个大致的了解:特别是这一部分对你来说非常相关: