Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.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数据库中的表中_Java_Android_Database_Sqlite - Fatal编程技术网

Java 数据不再保存到我的SQLite数据库中的表中

Java 数据不再保存到我的SQLite数据库中的表中,java,android,database,sqlite,Java,Android,Database,Sqlite,我的数据库中有两个表,users和player。 用户注册/登录并添加玩家。 用户id是players表中使用的外键。 我的代码运行良好,完美地保存了所有内容。 然而,我的模拟器出现了一个问题,它不断崩溃,所以我清除了它的内存并重新运行了我的应用程序。 现在我遇到了一个问题,当我注册/登录并添加一个播放器时,代码在调试模式下运行并看起来很好,但数据库中的表从未填充 我对此非常愤怒,因为它100%的工作正常,直到我抹去了它的记忆。 谁能提供一些支持 代码 DatabaseHelper.java p

我的数据库中有两个表,users和player。 用户注册/登录并添加玩家。 用户id是players表中使用的外键。 我的代码运行良好,完美地保存了所有内容。 然而,我的模拟器出现了一个问题,它不断崩溃,所以我清除了它的内存并重新运行了我的应用程序。 现在我遇到了一个问题,当我注册/登录并添加一个播放器时,代码在调试模式下运行并看起来很好,但数据库中的表从未填充

我对此非常愤怒,因为它100%的工作正常,直到我抹去了它的记忆。 谁能提供一些支持

代码 DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

// Database information
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "MyDB1.db";
private static final String TABLE_USER = "User";
private static final String TABLE_PLAYERS = "Player";
private DatabaseHelper myDBHelper;
private SQLiteDatabase db;

// Field names for Users
private static final String COLUMN_USER_NAME = "User_name";
private static final String COLUMN_USER_ID = "User_id";
private static final String COLUMN_USER_EMAIL = "User_email";
private static final String COLUMN_USER_PASSWORD = "User_password";


// Field names for Players
public static final String COLUMN_PLAYER_NAME = "Player_name";
public static final String COLUMN_PLAYER_AGE = "Player_age";
public static final String COLUMN_PLAYER_WEIGHT = "Player_weight";
public static final String COLUMN_PLAYER_HEIGHT = "Player_height";
public static final String COLUMN_PLAYER_ID = "Player_id";
public static final String FOREIGN_PLAYER_ID = COLUMN_USER_ID;
// private static final Image COLUMN_PLAYER_IMAGE ;

public static final String[] ALL_KEYS = new String[]{COLUMN_PLAYER_NAME, COLUMN_PLAYER_AGE, COLUMN_PLAYER_HEIGHT, COLUMN_PLAYER_WEIGHT};

// Table 1 : Login/Register
private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "(" + COLUMN_USER_NAME + " TEXT,"
        + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
        + COLUMN_USER_EMAIL + " TEXT," + COLUMN_USER_PASSWORD + " TEXT" + ")";


// Table 2 : Adding players
private String CREATE_PLAYER_TABLE = "CREATE TABLE " + TABLE_PLAYERS + "(" + COLUMN_PLAYER_NAME + " TEXT,"
        + COLUMN_PLAYER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
        + COLUMN_PLAYER_AGE + " INTEGER," + COLUMN_PLAYER_WEIGHT + " INTEGER," + COLUMN_PLAYER_HEIGHT + " INTEGER, " + FOREIGN_PLAYER_ID + " INTEGER," + "FOREIGN KEY(" + FOREIGN_PLAYER_ID + ") REFERENCES " + TABLE_USER + "(User_id) " + ")";


// Drop tables

private String DROP_USER_TABLE = "DROP TABLE IF EXISTS " + TABLE_USER;
private String DROP_PLAYER_TABLE = "DROP TABLE IF EXISTS " + TABLE_PLAYERS;


public DatabaseHelper(Context context) {
    //String name,  SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (!db.isReadOnly()) {
        // Enable foreign key constraints
        db.execSQL("PRAGMA foreign_keys=ON;");
    }
}

public DatabaseHelper open() {
    db = this.getReadableDatabase();
    return this;
}

@Override
public void onCreate(SQLiteDatabase db) {

    db.execSQL(CREATE_USER_TABLE);
    db.execSQL(CREATE_PLAYER_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(DROP_USER_TABLE);
    db.execSQL(DROP_PLAYER_TABLE);
    onCreate(db);
}


// Adding a user to Users table
public void addUser(User user) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    // Table 1 : Add users info
    values.put(COLUMN_USER_NAME, user.getName());
    values.put(COLUMN_USER_EMAIL, user.getEmail());
    values.put(COLUMN_USER_PASSWORD, user.getPassword());
    values.put(FOREIGN_PLAYER_ID, user.getForeignID());

    db.insert(TABLE_USER, null, values);
    db.close();
}

// Adding a player to players table

public void addPlayer(Player player) {

    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();


    // Table 2 : Add players info
    values.put(COLUMN_PLAYER_NAME, player.getPlayerName());
    values.put(COLUMN_PLAYER_AGE, player.getPlayerAge());
    values.put(COLUMN_PLAYER_HEIGHT, player.getPlayerHeight());
    values.put(COLUMN_PLAYER_WEIGHT, player.getPlayerWeight());
    values.put("Foreign_id", player.getForeignKey());

    db.insert(TABLE_PLAYERS, null, values);
    db.close();

}

// Checking the users email
public boolean checkUser(String email) {
    String[] columns = {
            COLUMN_USER_ID

    };
    SQLiteDatabase db = this.getWritableDatabase();
    String selection = COLUMN_USER_EMAIL + " = ?";
    String[] selectionArgs = {email};

    Cursor cursor = db.query(TABLE_USER,
            columns,
            selection,
            selectionArgs,
            null,
            null,
            null);
    int cursorCount = cursor.getCount();
    cursor.close();
    db.close();

    if (cursorCount > 0) {
        return true;
    }
    return false;
}


//
public String getColumnUserName(String email) {

    String user = "";
    String[] columns = {
            COLUMN_USER_ID

    };
    SQLiteDatabase db = this.getWritableDatabase();
    String selection = COLUMN_USER_EMAIL + " = ?";
    String[] selectionArgs = {email};

    Cursor cursor = db.query(TABLE_USER,
            columns,
            selection,
            selectionArgs,
            null,
            null,
            null);
    int cursorCount = cursor.getCount();
    String[] b = cursor.getColumnNames();

    if (cursor.moveToFirst()) // data?{
        user = cursor.getString(cursor.getColumnIndex("User_id"));

    cursor.close(); // that's important too, otherwise you're gonna leak cursors
    db.close();

    if (cursorCount > 0) {
        return user;
    }
    return user;
}

// Checking the users email and password
public boolean checkUser(String email, String password) {
    String[] columns = {
            COLUMN_USER_ID

    };
    SQLiteDatabase db = this.getWritableDatabase();
    String selection = COLUMN_USER_EMAIL + " = ?" + " AND " + COLUMN_USER_PASSWORD + " =?";
    String[] selectionArgs = {email, password};

    Cursor cursor = db.query(TABLE_USER,
            columns,
            selection,
            selectionArgs,
            null,
            null,
            null);
    int cursorCount = cursor.getCount();
    cursor.close();
    db.close();

    if (cursorCount > 0) {
        return true;
    }
    return false;
}


public Cursor getAllRows(){
    SQLiteDatabase db = this.getReadableDatabase();
    //String query = "SELECT * from "+TABLE_PLAYERS;
    Cursor cursor = db.rawQuery("select  Player_id _id, * from Player"  , null);


    return cursor;
}
}

AddPlayers.java

public class addPlayers extends AppCompatActivity implements 
 View.OnClickListener {

private Button insert;
private static final int PICK_IMAGE = 100;

private final AppCompatActivity activity = addPlayers.this;


private EditText editTextPlayerName;
private EditText editTextPlayerAge;
private EditText editTextPlayerWeight;
private EditText editTextPlayerHeight;

private TextInputEditText textInputEditTextEmail;
private Inputvalidation inputvalidation;
private DatabaseHelper databaseHelper;
private Player player;
private Button appCompatButtonRegister;
private User user;

DatabaseHelper myDb;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_players);
    // insert = (Button) findViewById(R.id.profilePicture);
    // insert.setOnClickListener(new View.OnClickListener()
    //getPlayersInformationListView();

    getSupportActionBar().hide();

    initViews();
    initListeners();
    initObjects();


}

private void initViews() {


    editTextPlayerName = (EditText) findViewById(R.id.playerName);
    editTextPlayerAge = (EditText) findViewById(R.id.playerAge);
    editTextPlayerHeight = (EditText) findViewById(R.id.playerHeight);
    editTextPlayerWeight = (EditText) findViewById(R.id.playerWeight);
    textInputEditTextEmail = (TextInputEditText) findViewById(R.id.enterEmail);
    appCompatButtonRegister = (Button) findViewById(R.id.savePlayer);

}

private void initListeners() {

    appCompatButtonRegister.setOnClickListener(this);

}

private void initObjects() {

    inputvalidation = new Inputvalidation(activity);
    databaseHelper = new DatabaseHelper(activity);
    player = new Player();

}

// Table 2 : Add players info

@Override
public void onClick(View v) {
    // Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://media/internal/images/media"));
    //startActivityForResult(intent, PICK_IMAGE);

    switch (v.getId()) {
        case R.id.savePlayer:
            postDataToSQLite();
            break;

    }


}


private void postDataToSQLite() {


    if (!databaseHelper.checkUser(editTextPlayerName.getText().toString().trim()))
    //textInputEditTextPassword.getText().toString().trim()))
    {
        Bundle email = getIntent().getExtras();
        String a = databaseHelper.getColumnUserName(email.getString("EMAIL"));

        player.setPlayerName(editTextPlayerName.getText().toString().trim());
        player.setPlayerAge(Integer.parseInt(editTextPlayerAge.getText().toString().trim()));
        player.setPlayerHeight(Integer.parseInt(editTextPlayerHeight.getText().toString().trim()));
        player.setPlayerWeight(Integer.parseInt(editTextPlayerWeight.getText().toString().trim()));
        player.setForeignKey(Integer.parseInt(a));


        databaseHelper.addPlayer(player);

        Intent accountIntent = new Intent(activity, Players.class);
        startActivity(accountIntent);





    }





}
 public class Players extends AppCompatActivity {

private Button insert;
private static final int PICK_IMAGE = 100;
private String nameFromIntent = "";
DatabaseHelper myDb;

ListView playersList;
ArrayList<String> listItem;
ArrayAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_players);

    openDB();
    getAllRows();

    myDb = new DatabaseHelper(this);

    //Open add players section
    insert = (Button) findViewById(R.id.addPlayer);
    insert.setOnClickListener(new View.OnClickListener()

    {

        @Override
        public void onClick(View v)

        {
            openAddPlayersActivity();


        }

    });

}

private void openDB() {
    myDb = new DatabaseHelper(this);
    myDb.open();
}

private void closeDB() {
    myDb.close();
}

private void getAllRows() {
    Cursor cursor = myDb.getAllRows();

    // Allow activity to manage lifetime of cursor
    // Deprecated
    startManagingCursor(cursor);

    // Setup mapping from cursor to view fields
    String[] fromFieldNames = new String[]
            {DatabaseHelper.COLUMN_PLAYER_NAME, DatabaseHelper.COLUMN_PLAYER_AGE, DatabaseHelper.COLUMN_PLAYER_WEIGHT, DatabaseHelper.COLUMN_PLAYER_HEIGHT};


    int[] toViewIDs = new int[]{R.id.textView01, R.id.textView02, R.id.textView5, R.id.textView6};

    // Create Adapter to map columns of DB onto elements in the UI
    SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
            this, R.layout.player_layout, cursor , fromFieldNames , toViewIDs);


    // Set the adapter for the list view
    ListView myList = (ListView) findViewById(R.id.playersList);
    myList.setAdapter(myCursorAdapter);

}

private void openAddPlayersActivity(){

    Intent intent = new Intent(this, addPlayers.class);
    String nameFromIntent = getIntent().getStringExtra("EMAIL");
    intent.putExtra(("EMAIL"), nameFromIntent);
    startActivity(intent);


}
}

Players.java

public class addPlayers extends AppCompatActivity implements 
 View.OnClickListener {

private Button insert;
private static final int PICK_IMAGE = 100;

private final AppCompatActivity activity = addPlayers.this;


private EditText editTextPlayerName;
private EditText editTextPlayerAge;
private EditText editTextPlayerWeight;
private EditText editTextPlayerHeight;

private TextInputEditText textInputEditTextEmail;
private Inputvalidation inputvalidation;
private DatabaseHelper databaseHelper;
private Player player;
private Button appCompatButtonRegister;
private User user;

DatabaseHelper myDb;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_players);
    // insert = (Button) findViewById(R.id.profilePicture);
    // insert.setOnClickListener(new View.OnClickListener()
    //getPlayersInformationListView();

    getSupportActionBar().hide();

    initViews();
    initListeners();
    initObjects();


}

private void initViews() {


    editTextPlayerName = (EditText) findViewById(R.id.playerName);
    editTextPlayerAge = (EditText) findViewById(R.id.playerAge);
    editTextPlayerHeight = (EditText) findViewById(R.id.playerHeight);
    editTextPlayerWeight = (EditText) findViewById(R.id.playerWeight);
    textInputEditTextEmail = (TextInputEditText) findViewById(R.id.enterEmail);
    appCompatButtonRegister = (Button) findViewById(R.id.savePlayer);

}

private void initListeners() {

    appCompatButtonRegister.setOnClickListener(this);

}

private void initObjects() {

    inputvalidation = new Inputvalidation(activity);
    databaseHelper = new DatabaseHelper(activity);
    player = new Player();

}

// Table 2 : Add players info

@Override
public void onClick(View v) {
    // Intent intent = new Intent(Intent.ACTION_PICK, Uri.parse("content://media/internal/images/media"));
    //startActivityForResult(intent, PICK_IMAGE);

    switch (v.getId()) {
        case R.id.savePlayer:
            postDataToSQLite();
            break;

    }


}


private void postDataToSQLite() {


    if (!databaseHelper.checkUser(editTextPlayerName.getText().toString().trim()))
    //textInputEditTextPassword.getText().toString().trim()))
    {
        Bundle email = getIntent().getExtras();
        String a = databaseHelper.getColumnUserName(email.getString("EMAIL"));

        player.setPlayerName(editTextPlayerName.getText().toString().trim());
        player.setPlayerAge(Integer.parseInt(editTextPlayerAge.getText().toString().trim()));
        player.setPlayerHeight(Integer.parseInt(editTextPlayerHeight.getText().toString().trim()));
        player.setPlayerWeight(Integer.parseInt(editTextPlayerWeight.getText().toString().trim()));
        player.setForeignKey(Integer.parseInt(a));


        databaseHelper.addPlayer(player);

        Intent accountIntent = new Intent(activity, Players.class);
        startActivity(accountIntent);





    }





}
 public class Players extends AppCompatActivity {

private Button insert;
private static final int PICK_IMAGE = 100;
private String nameFromIntent = "";
DatabaseHelper myDb;

ListView playersList;
ArrayList<String> listItem;
ArrayAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_players);

    openDB();
    getAllRows();

    myDb = new DatabaseHelper(this);

    //Open add players section
    insert = (Button) findViewById(R.id.addPlayer);
    insert.setOnClickListener(new View.OnClickListener()

    {

        @Override
        public void onClick(View v)

        {
            openAddPlayersActivity();


        }

    });

}

private void openDB() {
    myDb = new DatabaseHelper(this);
    myDb.open();
}

private void closeDB() {
    myDb.close();
}

private void getAllRows() {
    Cursor cursor = myDb.getAllRows();

    // Allow activity to manage lifetime of cursor
    // Deprecated
    startManagingCursor(cursor);

    // Setup mapping from cursor to view fields
    String[] fromFieldNames = new String[]
            {DatabaseHelper.COLUMN_PLAYER_NAME, DatabaseHelper.COLUMN_PLAYER_AGE, DatabaseHelper.COLUMN_PLAYER_WEIGHT, DatabaseHelper.COLUMN_PLAYER_HEIGHT};


    int[] toViewIDs = new int[]{R.id.textView01, R.id.textView02, R.id.textView5, R.id.textView6};

    // Create Adapter to map columns of DB onto elements in the UI
    SimpleCursorAdapter myCursorAdapter = new SimpleCursorAdapter(
            this, R.layout.player_layout, cursor , fromFieldNames , toViewIDs);


    // Set the adapter for the list view
    ListView myList = (ListView) findViewById(R.id.playersList);
    myList.setAdapter(myCursorAdapter);

}

private void openAddPlayersActivity(){

    Intent intent = new Intent(this, addPlayers.class);
    String nameFromIntent = getIntent().getStringExtra("EMAIL");
    intent.putExtra(("EMAIL"), nameFromIntent);
    startActivity(intent);


}
公共类玩家扩展AppCompative活动{
私人按钮插入;
私有静态最终整数选取图像=100;
私有字符串nameFromIntent=“”;
数据库助手myDb;
ListView播放器列表;
ArrayList列表项;
阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_播放器);
openDB();
getAllRows();
myDb=新数据库助手(此);
//打开添加玩家部分
插入=(按钮)findViewById(R.id.addPlayer);
insert.setOnClickListener(新视图.OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
OpenAddPlayerActivity();
}
});
}
私有void openDB(){
myDb=新数据库助手(此);
myDb.open();
}
私有void closeDB(){
myDb.close();
}
私有void getAllRows(){
Cursor=myDb.getAllRows();
//允许活动管理游标的生存期
//不赞成
开始管理游标(游标);
//设置从光标到视图字段的映射
字符串[]fromFieldNames=新字符串[]
{DatabaseHelper.COLUMN_PLAYER_NAME,DatabaseHelper.COLUMN_PLAYER_AGE,DatabaseHelper.COLUMN_PLAYER_WEIGHT,DatabaseHelper.COLUMN_PLAYER_HEIGHT};
int[]toViewIDs=newint[]{R.id.textView01,R.id.textView02,R.id.textView5,R.id.textView6};
//创建适配器以将DB列映射到UI中的元素
SimpleCursorAdapter myCursorAdapter=新SimpleCursorAdapter(
这是R.layout.player\u布局、光标、fromFieldNames、toViewIDs);
//设置列表视图的适配器
ListView myList=(ListView)findViewById(R.id.PlayerList);
设置适配器(myCursorAdapter);
}
私有void OpenAddPlayerActivity(){
Intent Intent=新Intent(这是addPlayers.class);
字符串名称fromIntent=getIntent().getStringExtra(“电子邮件”);
intent.putExtra((“电子邮件”),name fromtintent);
星触觉(意向);
}

}可能您在DatabaseHelper类中传递了错误的模型

public void addUser(User user){

//code..

}

public void add player(Player player){  
/* Are you sure you have created Player.java model?? Because you have another class Players.java too. And check for User.java model too..
another thing, make sure your model have default constructors. */

//code..

}

可能您在DatabaseHelper类中传递了错误的模型

public void addUser(User user){

//code..

}

public void add player(Player player){  
/* Are you sure you have created Player.java model?? Because you have another class Players.java too. And check for User.java model too..
another thing, make sure your model have default constructors. */

//code..

}

我认为您的问题在于,您试图使用用户id列(FK)中的用户名来添加玩家,而不是引用的用户id。这会导致以下情况:-

04-12 08:25:34.782 13798-13798/aaa.so55497937 E/SQLiteLog: (787) abort at 16 in [INSERT INTO Player(Player_age,Player_name,User_id,Player_weight,Player_height) VALUES (?,?,?,?,?)]: FOREIGN KEY constraint failed
04-12 08:25:34.783 13798-13798/aaa.so55497937 E/SQLiteDatabase: Error inserting Player_age=21 Player_name=Fred User_id=FRED Player_weight=75 Player_height=160
    android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
        at aaa.so55497937.DatabaseHelper.addPlayer(DatabaseHelper.java:125)
i、 e.User_id=FRED将不与用户表中引用的User_id列中的任何值关联(由于使用整数主键定义,因此该列将始终是一个数字(p.S.不需要自动递增,实际上是浪费资源))

也就是说,您可以使用以下方法为玩家设置异化:-

String a = databaseHelper.getColumnUserName(email.getString("EMAIL"));
同时,您应该将a设置为用户的“用户id”列。因此,或许可以添加以下方法:-

public String getColumnUserId(String email) {
    String rv = "";
    String[] columns = {COLUMN_USER_ID};
    String selection = COLUMN_USER_EMAIL + "=?";
    String[] selectionArgs = {email};
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.query(TABLE_USER,columns,selection,selectionArgs,null,null,null);
    if (cursor.moveToFirst()) {
        rv = cursor.getString(cursor.getColumnIndex(COLUMN_USER_ID));
    }
    cursor.close();
    db.close();
    return rv;
}
然后使用:-

String a = databaseHelper.getColumnUserId(email.getString("EMAIL"));

可能需要注意的是,如果事情没有按预期进行,尤其是在SQLite中,那么您应该检查日志(即,虽然已记录,但错误被捕获并忽略,因此不会崩溃)。

我认为您的问题在于,您正试图使用User\u nameUser\u id列(FK)添加播放器而不是引用的用户id。这将导致以下结果:-

04-12 08:25:34.782 13798-13798/aaa.so55497937 E/SQLiteLog: (787) abort at 16 in [INSERT INTO Player(Player_age,Player_name,User_id,Player_weight,Player_height) VALUES (?,?,?,?,?)]: FOREIGN KEY constraint failed
04-12 08:25:34.783 13798-13798/aaa.so55497937 E/SQLiteDatabase: Error inserting Player_age=21 Player_name=Fred User_id=FRED Player_weight=75 Player_height=160
    android.database.sqlite.SQLiteConstraintException: FOREIGN KEY constraint failed (code 787)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
        at aaa.so55497937.DatabaseHelper.addPlayer(DatabaseHelper.java:125)
i、 e.User_id=FRED将不与用户表中引用的User_id列中的任何值关联(由于使用整数主键定义,因此该列将始终是一个数字(p.S.不需要自动递增,实际上是浪费资源))

也就是说,您可以使用以下方法为玩家设置异化:-

String a = databaseHelper.getColumnUserName(email.getString("EMAIL"));
同时,您应该将a设置为用户的“用户id”列。因此,或许可以添加以下方法:-

public String getColumnUserId(String email) {
    String rv = "";
    String[] columns = {COLUMN_USER_ID};
    String selection = COLUMN_USER_EMAIL + "=?";
    String[] selectionArgs = {email};
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.query(TABLE_USER,columns,selection,selectionArgs,null,null,null);
    if (cursor.moveToFirst()) {
        rv = cursor.getString(cursor.getColumnIndex(COLUMN_USER_ID));
    }
    cursor.close();
    db.close();
    return rv;
}
然后使用:-

String a = databaseHelper.getColumnUserId(email.getString("EMAIL"));

可能需要注意的是,如果事情没有按预期进行,特别是在SQLite中,那么您应该检查日志(即,虽然已记录,但错误被捕获并忽略,因此不会崩溃)。

这可能很奇怪,可能对您有效,也可能无效,但我过去也遇到过类似的问题。尝试更改db名称,看看这是否解决了您的问题……您是否已登录并查看数据库帮助器类是否按预期工作。特别是onCreate方法。另外,请尝试更改数据库版本并运行代码。我建议您研究一下,它比SQLite更安全(不容易出错),更易于直接使用。在Android开发者频道的Room上观看youtube。这可能很奇怪,它可能对你有用,也可能不管用,但我过去也遇到过类似的问题。尝试更改db名称,看看这是否解决了您的问题……您是否已登录并查看数据库帮助器类是否按预期工作。特别是onCreate方法。另外,请尝试更改数据库版本并运行代码。我建议您研究一下,它比SQLite更安全(不容易出错),更易于直接使用。通过Android开发者频道在Room上观看youtube。