尝试检索android数据库的rowid时始终返回0
我正在使用SQLite数据库来存储关于使用android的球员及其团队的信息。我已经让它工作了,所以我创建的所有玩家在我启动程序时都会出现,所以数据库工作正常。到目前为止,一切顺利 但是,每当我尝试从数据库检索播放器的rowId时,它总是返回0。 这本身就让我感到惊讶,因为如果我没有正确地从光标访问它,我会认为我会得到一个错误,但是它给了我0 经过一段时间的调试,我意识到Player对象(不在数据库中)也没有正确保存id,尽管它正在为它找到一个值。当我在创建对象后设置id时,这一点得到了纠正,尽管我似乎可以在创建语句本身中设置它。好奇者和好奇者 即使我有了行的id,我也不能编辑它。Player对象将会改变,但是如果我真的再次从数据库中检索Player,它一点也没有改变 对我来说最奇怪的是,在整个过程中,我在任何时候都没有收到任何错误 想法?提前感谢您的帮助!:-) 以下是我的数据库帮助程序代码:尝试检索android数据库的rowid时始终返回0,android,sqlite,Android,Sqlite,我正在使用SQLite数据库来存储关于使用android的球员及其团队的信息。我已经让它工作了,所以我创建的所有玩家在我启动程序时都会出现,所以数据库工作正常。到目前为止,一切顺利 但是,每当我尝试从数据库检索播放器的rowId时,它总是返回0。 这本身就让我感到惊讶,因为如果我没有正确地从光标访问它,我会认为我会得到一个错误,但是它给了我0 经过一段时间的调试,我意识到Player对象(不在数据库中)也没有正确保存id,尽管它正在为它找到一个值。当我在创建对象后设置id时,这一点得到了纠正,尽
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; }
}
}