android - 尝试检索 android 数据库的 rowid 总是返回 0

标签 android sqlite

我正在使用 SQLite 数据库存储有关使用 android 的球员及其球队的信息。我让它工作,所以我创建的所有玩家都会在我启动我的程序时显示出来,所以数据库正在工作。到目前为止,还不错。

但是,每当我尝试从数据库中检索玩家的 rowId 时,它总是返回 0。 这本身就让我感到惊讶,因为如果我没有从光标正确访问它,我认为我会得到一个错误,但它却给了我 0。

调试一段时间后,我意识到 Player 对象(不在数据库中)也没有正确保存 id,尽管它正在为它找到一个值。当我在创建对象后设置 id 时,这已得到纠正,尽管我似乎可以在创建语句本身中设置它。越来越好奇。

即使有了行的 ID,我也无法对其进行编辑。 Player 对象会改变,但如果我真的再次从数据库中检索播放器,它根本没有改变。

对我来说最奇怪的是,在整个过程中,我在任何时候都没有收到任何错误。

想法?预先感谢您的帮助! :-)

这是我的数据库助手代码:

    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 是一个添加了菜单的 Activity ):

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

 }

}

最佳答案

实际上,我认为自动递增的正确公式是:

INTEGER PRIMARY KEY AUTOINCREMENT

不是

AUTO_INCREMENT

关于android - 尝试检索 android 数据库的 rowid 总是返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3424845/

相关文章:

android - 在android中关闭webview

android - Android 蓝牙扫描是否通过 onScanResult 回调提供缓存/缓冲的结果?

java - 在模拟器中运行时,libgdx 在 helloworld 应用程序上抛出异常

android - SQLite查询SQLiteLog(1)没有这样的Column :

android - 如何在 SQLite 中存储 JSON

java - 如何将多个列表放入一个列表中?

android - 更新后无法运行我的应用程序

SQLite 'INSERT INTO' 错误 - 填充新表

java - 如何在sqlite select语句中设置2位小数

sql - 在没有窗口函数的情况下实现 SQL 查询