在我的项目中,我有按如下方式命名的表:
places(int id auto increment, string placename, double latitude, double longitude, string placedetails)
现在,我创建了两个类,如下所示:
地点.java(用于模型(吸气者和二传手((
public class Place {
private String mname;
private double mlatitude,mlongitude;
private String mplacedetails;
public Place(String name, double latitude, double longitude,String placedetails)
{
mname = name;
mlatitude = latitude;
mlongitude = longitude;
mplacedetails = placedetails;
}
public Place() {
}
public void setname(String placename)
{
mname = placename;
}
public String getname()
{
return mname;
}
public void setlatitude(double latitude)
{
mlatitude=latitude;
}
public double getlatitude()
{
return mlatitude;
}
public void setlongitude(double longitude)
{
mlongitude = longitude;
}
public double getlongitude()
{
return mlongitude;
}
public void setPlacedetails(String placedetails)
{
mplacedetails = placedetails;
}
public String getplacedetails()
{
return mplacedetails;
}
}
MySDQLiteHelper.java (扩展SQLiteOpenHelper
的类(
public class MySqliteHelper extends SQLiteOpenHelper{
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "MyApplicationDatabase";
private static final String KEY_ID = "id";
private static final String KEY_PLACENAME = "placename";
private static final String KEY_PLACEDETAILS = "placedetails";
private static final String KEY_LATITUDE = "latitude";
private static final String KEY_LONGITUDE = "longitude";
private static final String TABLE_NAME = "places";
public MySqliteHelper(Context context) {
super(context, DATABASE_NAME,null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//actual query = create table places (id primary key autoincrement, placename taxt, latitude real, longitude real);
String query = "CREATE TABLE " +TABLE_NAME + "( " + KEY_ID+
" INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_PLACENAME+
" TEXT, "+ KEY_PLACEDETAILS+
" TEXT, "+ KEY_LATITUDE+
" REAL, "+KEY_LONGITUDE+ " REAL)";
db.execSQL(query);
Log.d("my", "Successfully created table: " + query);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS places");
this.onCreate(db);
}
public void addPlaces(Place place)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues convalues = new ContentValues();
convalues.put(KEY_PLACENAME,place.getname());
convalues.put(KEY_LATITUDE,place.getlatitude());
convalues.put(KEY_LONGITUDE,place.getlongitude());
convalues.put(KEY_PLACEDETAILS,place.getplacedetails());
db.insert(TABLE_NAME, null, convalues);
Log.d("my","db.insert(TABLE_NAME, null, convalues)");
Log.d("my", "Values inserted");
db.close();
}
public Place getPlace(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_NAME, new String[] { KEY_ID, KEY_LATITUDE, KEY_LONGITUDE,
KEY_PLACENAME, KEY_PLACEDETAILS }, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Place place = new Place(cursor.getString(1),
cursor.getDouble(2), cursor.getDouble(3),cursor.getString(4));
return place;
}
public List<Place> getAllPlaces() {
List<Place> placeList = new ArrayList<Place>();
SQLiteDatabase db = this.getWritableDatabase();
String selectQuery = "SELECT * FROM " + TABLE_NAME;
Cursor cursor = db.rawQuery(selectQuery, null);
Log.d("my","query fired");
Log.d("my",cursor.toString());
if (cursor.moveToFirst()) {
Log.d("my","in movetofirst()");
do {
Log.d("my","in do");
Place place = new Place();
place.setname(cursor.getString(1));
Log.d("my","place name");
place.setlatitude(cursor.getDouble(2));
place.setlongitude(cursor.getDouble(3));
place.setPlacedetails(cursor.getString(4));
placeList.add(place);
} while (cursor.moveToNext());
}
return placeList;
}
}
每次我从单击按钮时从活动中调用addPlace
,例如:
mpostplacename = (EditText) findViewById(R.id.edittext_placename);
mpostplacedetails = (EditText) findViewById(R.id.edittext_placedetails);
gps = new GPSTracker(RememberActivity.this);
if(gps.canGetLocation()) {
mylatitude = gps.getLatitude();
mylongitude = gps.getLongitude();
Toast.makeText(getApplicationContext(), "Your Location is - nLatitude: " + mylatitude + "nLongitude: " + mylongitude, Toast.LENGTH_LONG).show();
myplacename = mpostplacename.getText().toString();
myplacedetails = mpostplacedetails.getText().toString();
if(myplacename==null)
{
myplacename = mylatitude+" "+mylongitude;
}
if(myplacedetails==null)
{
myplacedetails = "No details given about this place";
}
MySqliteHelper db = new MySqliteHelper(this);
db.addPlaces(new Place(myplacename, mylatitude, mylongitude, myplacedetails));
当我想在日志中显示存储的数据时,例如:
MySqliteHelper db = new MySqliteHelper(this);
List<Place> places = db.getAllPlaces();
for (Place p : places) {
String log = "name:" + p.getname() + " ,details: " + p.getplacedetails();
Log.d("my", log);
}
插入地名和地点详细信息(作为一些字符串值,如blablabla等(后,日志显示地名正确,但地点详细信息错误:
D/my﹕ name:sdsdsda ,details: 0
D/my﹕ name:aaaaaaaaaaa ,details: 0
为什么getplacedetails
不起作用?我在游标索引中找不到任何错误。可能是索引中的错误...因为它找不到索引上的位置详细信息。谁能帮我?
像这样替换代码行:
place.setname(cursor.getString(1));
像这样:
place.setname(cursor.getString(cursor.getColumnIndex(KEY_PLACENAME)));
看起来与KEY_PLACEDETAILS
对应的列实际上是第 2 列,您正在尝试从第 4 列中获取一些内容。无论如何,使用 cursor.getColumnIndex()
使列与每个键匹配更安全,以防您的数据库稍后更改并帮助避免此类错误。
尝试这种方式来创建Place
对象并在getAllPlaces(...)
方法中添加placeList
placeList.add(new Place(cursor.getString(1),cursor.getDouble(2),cursor.getDouble(3),cursor.getString(4)));
也改变你的地点.java
public class Place {
private String mname;
private double mlatitude,mlongitude;
private String mplacedetails;
public Place(String name, double latitude, double longitude,String placedetails)
{
this.mname = name;
this.mlatitude = latitude;
this.mlongitude = longitude;
this.mplacedetails = placedetails;
}
public void setname(String placename)
{
this.mname = placename;
}
public String getname()
{
return mname;
}
public void setlatitude(double latitude)
{
this.mlatitude=latitude;
}
public double getlatitude()
{
return mlatitude;
}
public void setlongitude(double longitude)
{
this.mlongitude = longitude;
}
public double getlongitude()
{
return mlongitude;
}
public void setPlacedetails(String placedetails)
{
this.mplacedetails = placedetails;
}
public String getplacedetails()
{
return mplacedetails;
}
}