尝试检索android数据库的rowid时始终返回0

尝试检索android数据库的rowid时始终返回0,android,sqlite,Android,Sqlite,我正在使用SQLite数据库来存储关于使用android的球员及其团队的信息。我已经让它工作了,所以我创建的所有玩家在我启动程序时都会出现,所以数据库工作正常。到目前为止,一切顺利 但是,每当我尝试从数据库检索播放器的rowId时,它总是返回0。 这本身就让我感到惊讶,因为如果我没有正确地从光标访问它,我会认为我会得到一个错误,但是它给了我0 经过一段时间的调试,我意识到Player对象(不在数据库中)也没有正确保存id,尽管它正在为它找到一个值。当我在创建对象后设置id时,这一点得到了纠正,尽

我正在使用SQLite数据库来存储关于使用android的球员及其团队的信息。我已经让它工作了,所以我创建的所有玩家在我启动程序时都会出现,所以数据库工作正常。到目前为止,一切顺利

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

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

即使我有了行的id,我也不能编辑它。Player对象将会改变,但是如果我真的再次从数据库中检索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();

     }

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

整数主键自动递增

不是

自动增量


好主意!我刚试过,但它崩溃了。LogCat说它发现了一个“自动增量附近的语法错误”,所以我认为这部分还可以。另外,当我添加一个播放器时,我得到了一个非0的值,这应该是rowId,所以这似乎起作用了。谢谢你的帮助!奇怪的我总是这样写,从来没有撞车。如果您对数据库有问题,请下载SQLite数据库浏览器,它对处理数据库有很大帮助。哇,SQLite数据库浏览器棒极了!谢谢你说得对,出于某种原因,它根本没有向id字段添加任何内容,它只包含“.Oops!”!在进一步的检查中,事实是我忘记了结尾的逗号,自动递增不起作用!哎呀!当我替换:
id
INTEGER AUTO_INCREMENT DEFAULT NULL时,“使用
id
INTEGER主键AUTOINCREMENT”,它起作用了!我不确定最初是删除默认值还是将其指定为主键,但现在它有了一个id。耶!事实上,我没有注意到这一点。你实际上有两个错误,自动递增的拼写错误和默认的空值错误,在这种情况下完全没有意义。祝您使用SQLite数据库浏览器好运。当我构建原始查询时,它为我节省了很多时间。
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; }

 }

}