У меня есть две таблицы в моей базе данных, пользователи и игроки. Пользователь зарегистрироваться / войти и добавить игроков. Идентификатор пользователя - это внешний ключ, используемый в таблице игроков. Мой код работал нормально и все прекрасно сохранял. Однако у меня была проблема с моим эмулятором, из-за которой он продолжал падать, поэтому я стер его память и перезапустил свое приложение. Теперь у меня есть проблема, когда при регистрации / входе в систему и добавлении проигрывателя код запускается и выглядит нормально в режиме отладки, но его таблица в базе данных никогда не заполняется

Я так взбешен этим, потому что он работал на 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);





    }





}

}

Players.java

 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);


}

}

0
Eamon Mac 11 Апр 2019 в 20:28

2 ответа

Лучший ответ

Я полагаю, что ваша проблема в том, что вы пытаетесь добавить игроков, используя имя_пользователя для столбца идентификатор_пользователя (FK), а не ссылочный идентификатор_пользователя. Это приводит к чему-то вроде:

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)

Т.е. User_id = FRED не будет коррелировать с каким-либо значением в указанном столбце User_ID в пользовательской таблице (которое из-за того, что оно определено с использованием INTEGER PRIMARY KEY, всегда будет числом (PS AUTOINCREMENT не требуется и на самом деле неэффективно расходует ресурсы < a href = "https://sqlite.org/autoinc.html" rel = "nofollow noreferrer"> Автоинкремент SQLite ) )

То есть вы устанавливаете ForeignID для игрока, используя: -

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

Пока вы должны устанавливать a в столбце user_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, то вам следует проверить журнал (т. Е. Хотя он зарегистрирован, ошибка перехватывается и игнорируется и, следовательно, не вылетает).

1
MikeT 11 Апр 2019 в 23:04

Возможно, вы передаете неправильные модели в классе 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..

}
1
Pika the Wizard of the Whales 11 Апр 2019 в 21:18