2010-08-06 8 views
2

Я использую базу данных SQLite для хранения информации о игроках и их командах с помощью Android. У меня это работает, так что все создаваемые мной игроки появятся, когда я начну свою программу, поэтому база данных работает. Все идет нормально.Попытка получить базу данных базы данных android всегда возвращает 0

Однако всякий раз, когда я пытаюсь получить rowId игрока из базы данных, он всегда возвращает мне 0. Это меня удивляет, так как я думаю, что я получу ошибку, если бы я не получал его правильно от курсора, но вместо этого он дал мне 0.

После некоторой отладки я понял, что объект Player (а не в базе данных) также не сохранил идентификатор правильно, хотя он нашел для него значение. Это было исправлено, когда я установил идентификатор после создания объекта, хотя, похоже, я смог бы установить его в самом заявлении о создании. Любопытный и любопытный.

Даже после того, как у меня есть идентификатор строки, я не могу ее отредактировать. Объект Player изменится, но если я действительно снова извлешу игрока из базы данных, он вообще не изменился.

Странно, что я не получаю никаких ошибок в любой момент на протяжении всего этого процесса.

Идеи? Заранее спасибо за вашу помощь! :-)

Вот мой код базы данных Helper:

public class VolleyDbAdapter { 

// Common 
public static final String KEY_ROWID = "id"; 
public static final String KEY_NOTES = "Notes"; 

// Player 
public static final String KEY_NUMBER = "Number"; 
public static final String KEY_POSITION = "Position"; 
public static final String KEY_FNAME = "FirstName"; 
public static final String KEY_LNAME = "LastName"; 
public static final String KEY_TEAMID = "teamId"; 


private static final String TAG = "NotesDbAdapter"; 
private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb; 

/** 
    * Database creation sql statement 
    */ 
private static final String DATABASE_CREATE_PLAYERS = "CREATE TABLE 'players' (" 
    + " `id` INTEGER AUTO_INCREMENT DEFAULT NULL," 
    + " `Number` INTEGER DEFAULT NULL," 
    + " `Position` VARCHAR DEFAULT NULL," 
    + " `FirstName` MEDIUMTEXT DEFAULT NULL," 
    + " `LastName` MEDIUMTEXT DEFAULT NULL," 
    + " `teamId` INTEGER DEFAULT NULL," 
    + " `Notes` MEDIUMTEXT DEFAULT NULL," 
    + " PRIMARY KEY (`id`)" 
    + ");"; 

private static final String DATABASE_PLAYERS = "players"; 
private static final int DATABASE_VERSION = 5; 

private final Context mCtx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 

    db.execSQL(DATABASE_CREATE_PLAYERS); 
    db.execSQL(DATABASE_CREATE_GAMES); 
    db.execSQL(DATABASE_CREATE_STATS); 
    db.execSQL(DATABASE_CREATE_MATCHES); 
    db.execSQL(DATABASE_CREATE_LINEUPS); 
    db.execSQL(DATABASE_CREATE_TEAMS); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
    + newVersion + ", which will destroy all old data"); 

    // Add this later, when actually might update the database 
    // Don't want to accidentally delete something now! 
    db.execSQL("DROP TABLE IF EXISTS players;"); 
    db.execSQL("DROP TABLE IF EXISTS teams;"); 
    db.execSQL("DROP TABLE IF EXISTS matches;"); 
    db.execSQL("DROP TABLE IF EXISTS games;"); 
    db.execSQL("DROP TABLE IF EXISTS lineups;"); 
    db.execSQL("DROP TABLE IF EXISTS stats;"); 
    onCreate(db); 
    } 
} 

public VolleyDbAdapter(Context ctx) { 
    this.mCtx = ctx; 
} 

public VolleyDbAdapter open() throws SQLException { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mDbHelper.close(); 
} 

public long createPlayer(String fname, String lname, int number, 
    String position, long teamId) { 
    ContentValues initialValues = new ContentValues(); 

    initialValues.put(KEY_FNAME, fname); 
    initialValues.put(KEY_LNAME, lname); 
    initialValues.put(KEY_NUMBER, number); 
    initialValues.put(KEY_POSITION, position); 
    initialValues.put(KEY_TEAMID, teamId); 
    // Add the teamId? 

    return mDb.insert(DATABASE_PLAYERS, null, initialValues); 
} 

public boolean deletePlayer(long rowId) { 

    return mDb.delete(DATABASE_PLAYERS, KEY_ROWID + "=" + rowId, null) > 0; 
} 

public boolean deletePlayer(int number) { 

    return mDb.delete(DATABASE_PLAYERS, KEY_NUMBER + "=" + number, null) > 0; 
} 

public Cursor fetchAllPlayers() { 

    return mDb.query(DATABASE_PLAYERS, new String[] { KEY_ROWID, 
    KEY_NUMBER, KEY_POSITION, KEY_FNAME, KEY_LNAME, KEY_TEAMID, 
    KEY_NOTES }, null, null, null, null, null); 
} 

public Cursor fetchPlayer(long rowId) throws SQLException { 

    Cursor mCursor = 

    mDb.query(true, DATABASE_PLAYERS, new String[] { KEY_ROWID, KEY_NUMBER, 
    KEY_POSITION, KEY_FNAME, KEY_LNAME, KEY_TEAMID, KEY_NOTES }, 
    KEY_ROWID + "=" + rowId, null, null, null, null, null); 
    if (mCursor != null) { 
    mCursor.moveToFirst(); 
    } 
    return mCursor; 

} 

public Cursor fetchPlayer(int number) throws SQLException { 

    Cursor mCursor = 

    mDb.query(true, DATABASE_PLAYERS, new String[] { KEY_ROWID, KEY_NUMBER, 
    KEY_POSITION, KEY_FNAME, KEY_LNAME, KEY_TEAMID, KEY_NOTES }, 
    KEY_NUMBER + "=" + number, null, null, null, null, null); 
    if (mCursor != null) { 
    mCursor.moveToFirst(); 
    } 
    return mCursor; 

} 

public boolean updatePlayer(long rowId, String fname, String lname, 
    int number, String position, long teamId) { 
    ContentValues args = new ContentValues(); 

    args.put(KEY_FNAME, fname); 
    args.put(KEY_LNAME, lname); 
    args.put(KEY_NUMBER, number); 
    args.put(KEY_POSITION, position); 
    args.put(KEY_TEAMID, teamId); 
    return mDb 
    .update(DATABASE_PLAYERS, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 

И для загрузки игроков:

public class GlobalApp extends Application { 
SharedPreferences preferences; 
VolleyDbAdapter mDbHelper; 
public long teamId; 
public long matchId; 
public long gameId; 


ArrayList<Player> playerList; 
ArrayList<Player> court; 
ArrayList<Player> play; 

public int selectedPlayer; 
public int selectedPosition; 
//More vars not shown 


public void onCreate() { 
    super.onCreate(); 
    preferences = PreferenceManager.getDefaultSharedPreferences(this); 
    initializeVars(); 
    importOldData(); 
} 

public void importOldData() { 
    mDbHelper = new VolleyDbAdapter(this); 
    mDbHelper.open(); 
    getPlayersFromDatabase(); 
    mDbHelper.close(); 
} 

    public void getPlayersFromDatabase() { 
     Cursor c = mDbHelper.fetchPlayersFromTeam(getTeamId()); 
     c.moveToFirst(); 
     while (c.isAfterLast() == false) { 
     long myId = c.getInt(c.getColumnIndex(VolleyDbAdapter.KEY_ROWID)); 
     String fname = c.getString(c 
     .getColumnIndex(VolleyDbAdapter.KEY_FNAME)); 
     String lname = c.getString(c 
     .getColumnIndex(VolleyDbAdapter.KEY_LNAME)); 
     String pos = c.getString(c 
     .getColumnIndex(VolleyDbAdapter.KEY_POSITION)); 
     String num = c.getString(c 
     .getColumnIndex(VolleyDbAdapter.KEY_NUMBER)); 
     long ti = c.getLong(c.getColumnIndex(VolleyDbAdapter.KEY_TEAMID)); 

     Player p = new Player(myId, fname, lname, num, pos, ti); 
     addPlayer(p); 

     c.moveToNext(); 
     } 
     c.close(); 

    } 

Код для создания нового игрока (MenuManager является деятельность, которая имеет меню добавлены к нему):

public class EditPlayer extends MenuManager implements OnClickListener { 

GlobalApp global; 
VolleyDbAdapter mDbHelper; 

EditText s1, s2, s3; 
Button b1; 
Spinner choosePos; 
int editPosition; 
// Player selectedPlayer; 
ArrayAdapter<CharSequence> adapter; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.edit_player); 
    global = ((GlobalApp) getApplicationContext()); 
    mDbHelper = new VolleyDbAdapter(this); 
    mDbHelper.open(); 

    s1 = (EditText) this.findViewById(R.id.player_input_fname); 
    s2 = (EditText) this.findViewById(R.id.player_input_lname); 
    s3 = (EditText) this.findViewById(R.id.player_input_number); 

    choosePos = (Spinner) findViewById(R.id.choosePos); 
    adapter = ArrayAdapter.createFromResource(this, R.array.positions, 
    android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    choosePos.setAdapter(adapter); 

    b1 = (Button) this.findViewById(R.id.player_submit); 
    b1.setOnClickListener(this); 

    if (global.getSelectedPlayer() != null) { 
    fillFields(); 
    } 

} 

public void fillFields() { 
    s1.setText(global.getSelectedPlayer().getFName()); 
    s2.setText(global.getSelectedPlayer().getLName()); 
    s3.setText(global.getSelectedPlayer().getNumber()); 
    choosePos.setSelection(adapter.getPosition(global.getSelectedPlayer() 
    .getPosition())); 

} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.player_submit: 

    if (global.getSelectedPlayer() == null) { 
    long myId = mDbHelper.createPlayer(s1.getText().toString(), s2 
     .getText().toString(), Integer.parseInt(s3.getText() 
     .toString()), choosePos.getSelectedItem().toString(), 
     global.teamId); 

    Player myP = new Player(myId, s1.getText().toString(), s2 
     .getText().toString(), s3.getText().toString(), 
     choosePos.getSelectedItem().toString(), global 
     .getTeamId()); 
    myP.setId(myId); 

    global.addPlayer(myP); 
    global.sortPlayers(global.NUMBER); 

    Intent intent = new Intent(); 
    setResult(RESULT_OK, intent); 
    finish(); 
    } else { 
    Player p = global.getSelectedPlayer(); 
    p.setFName(s1.getText().toString()); 
    p.setLName(s2.getText().toString()); 
    p.setNumber(s3.getText().toString()); 
    p.setPosition(choosePos.getSelectedItem().toString()); 

    mDbHelper.updatePlayer(p.getId(), p.getFName(), p.getLName(), 
     p.getIntNumber(), p.getPosition(), p.getTeamId()); 

    global.sortPlayers(global.NUMBER); 

    Intent intent = new Intent(); 
    setResult(RESULT_OK, intent); 
    finish(); 
    } 

    // this.finish(); 

    // setResult(0); 
    break; 
    } 

} 

} 

И, наконец, сам плеер:

public class Player{ 
String number; 
String fname; 
String lname; 
String position; 
long id; 
long teamId; 

public Player(String fn, String ln, String nu, String p, long t) { 
    fname = fn; 
    lname = ln; 
    number = nu; 
    position = p; 
    teamId = t; 
} 

public Player(long i, String fn, String ln, String nu, String p, long t) { 
    id = i; 
    fname = fn; 
    lname = ln; 
    number = nu; 
    position = p; 
    teamId = t; 
} 

public void setId(long i) { id = i; } 
public long getId() { return id; } 
public long getTeamId() {return teamId; } 
//You should never need to set the teamId outside of the constructor 


public String getFName() { return fname; } 
public String getLName() { return lname; } 
public String getFullName() { return fname + " " + lname; } 


public String getNumber() { return number; } 
public int getIntNumber() { return Integer.valueOf(getNumber()); } 
public String getPosition() { return position; } 

public int getHits() { return hits; } 
public int getSets() { return sets; } 
public int getSetsKills() { return setsKills; } 
public int getPasses() { return passes; } 
public int getPassesKills() { return passesKills; } 
public int getHitsKills() { return hitsKills; } 
public int getHitsMisses() { return hitsMisses; } 
public int getBlocks() { return blocks; } 

public void setFName(String s) { fname = s; } 
public void setLName(String s) { lname = s; } 
public void setNumber(String s) { number = s; } 
public void setPosition(String s) { position = s; } 

public String toString() { return getNumber(); } 

public String showMyStats() { 

    /*TableLayout tb = new TableLayout(c); 
    tb.addView(getStatRow("Number: ", getNumber(), c)); 
    tb.addView(getStatRow("Name: ", getName(), c)); 
    tb.addView(getStatRow("Position: ", getPosition(), c)); 
    tb.addView(getStatRow("", "", c)); 
    tb.addView(getStatRow("Hit Attempts: ", getHits(), c)); 
    tb.addView(getStatRow("Kills", getHitsKills(), c)); 
    tb.addView(getStatRow("", "", c)); 
    tb.addView(getStatRow("", "", c));*/ 

    String stats = ""; 
    stats += "Number: " + getNumber() + "\n"; 
    stats += "Name: " + getFullName() + "\n"; 
    stats += "Position: " + getPosition() + "\n"; 
    stats += "\n"; 
    stats += "Hit Attempts: " + getHits() + "\n"; 
    stats += "Kills: " + getHitsKills() + "\n"; 
    stats += "Misses: " + getHitsMisses() + "\n"; 
    stats += "Hitting Percentage: " + getHittingPercentage() + "\n"; 
    stats += "\n"; 
    stats += "Sets: " + getSets() + "\n"; 
    stats += "Set Kills: " + getSetsKills() + "\n"; 
    stats += "Setting Percentage: " + getSettingPercentage() + "\n"; 
    stats += "\n"; 
    stats += "Passes: " + getPasses() + "\n"; 
    stats += "Passes Kills: " + getPassesKills() + "\n"; 
    stats += "Passing Percentage: " + getPassingPercentage() + "\n"; 


    //TextView popup = new TextView(c); 
    //popup.setLayout(new TableLayout()); 
    //popup.setText(stats); 


    return stats; 
} 

public TableRow getStatRow(String s1, String s2, Context c) { 
    TableRow tr = new TableRow(c); 
    TextView t = new TextView(c); 

    t.setText(s1); 
    tr.addView(t); 
    t.setText(s2); 
    tr.addView(t); 

    return tr; 

} 

public TableRow getStatRow(String s1, int s2, Context c) { 
    return getStatRow(s1, Integer.toString(s2), c); 

} 

public double getHittingPercentage() { 
    if(getHits() > 0) { 
    return (getHitsKills()-getHitsMisses())/getHits(); 
    } else { return 0; } 

} 

public double getSettingPercentage() { 
    if(getSets() > 0) { 
    return (getSetsKills())/getSets(); 
    } else { return 0; } 

} 

public double getPassingPercentage() { 
    if(getPasses() > 0) { 
    return (getPassesKills())/getPasses(); 
    } else { return 0; } 

} 

} 

ответ

1

На самом деле, я думаю, правильную формулу для автоматического инкремента:

INTEGER PRIMARY KEY AUTOINCREMENT

не

AUTO_INCREMENT

+0

Хорошая идея! Я просто попробовал это, но он разбился. LogCat говорит, что обнаружил «синтаксическую ошибку около AUTOINCREMENT», поэтому я думаю, что эта часть в порядке. Кроме того, я получаю значение non-0, возвращаемое при добавлении игрока, и это должно быть rowId, так что, похоже, работает. Спасибо за помощь, хотя! – Geekgirl

+0

странный. Я всегда так писал и никогда не сталкивался с крушением. Если у вас есть проблемы с базами данных, загрузите браузер базы данных SQLite, он очень помогает в работе с базами данных. – Sephy

+0

Ничего себе, SQLite базы данных браузера пород! Благодаря! Вы правы, по какой-то причине он ничего не добавляет к полю id, он просто содержит «». – Geekgirl

Смежные вопросы