我想在数据库的表中获取一个保存对象的主键我写了一个类来处理我的数据库我想为它添加一个函数来获取Id(我试图手动将id赋予对象)好的,所以我更喜欢主键ID,所以这个函数应该怎么样?如果你看到我的代码需要更改的东西,请告诉我。
public class DataBaseHandler extends SQLiteOpenHelper {
private static int _ID =0;
private int ID =0;
private ArrayList<marker_model> markerList=new ArrayList<>();
public DataBaseHandler(Context context) {
super(context, Constans.TABLE_NAME, null, Constans.DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "+Constans.TABLE_NAME+
" ("+Constans.MARKER_ID+" INTEGER PRIMARY KEY, "+
Constans.MARKER_TITLE+" TEXT, " +Constans.MARKER_DESCRIPTION+" TEXT ,"+Constans.My_MARKER_ID+" INT );");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS "+Constans.TABLE_NAME);
onCreate(db);
}
public void AddMarker(marker_model marker){
marker.set_Id(_ID);
SQLiteDatabase db=this.getWritableDatabase();
ContentValues values=new ContentValues();
values.put(Constans.MARKER_TITLE,marker.getTitle());
values.put(Constans.My_MARKER_ID,marker.get_Id());
values.put(Constans.MARKER_DESCRIPTION,marker.getDescription());
db.insert(Constans.TABLE_NAME,null,values);
db.close();
Log.d(TAG, "AddMarker: Successfully added to DB");
_ID++;
}
public ArrayList<marker_model> getMarkers(){
markerList.clear();
SQLiteDatabase db =getReadableDatabase();
Cursor cursor=db.query(Constans.TABLE_NAME
,new String[]{Constans.My_MARKER_ID,Constans.MARKER_TITLE,
Constans.MARKER_DESCRIPTION},null,null,null,null,null);
if (cursor.moveToFirst()){
do {
ID=0;
marker_model model=new marker_model();
model.set_Id(_ID);
model.setDescription(cursor.getString(cursor.getColumnIndex(Constans.MARKER_DESCRIPTION)));
model.setTitle(cursor.getString(cursor.getColumnIndex(Constans.MARKER_TITLE)));
markerList.add(model);
ID++;
}while(cursor.moveToNext());
}
cursor.close();
db.close();
return markerList;
}
public int getMarkerPrimaryId(Marker marker){
}
}
答案 0 :(得分:0)
假设您想从数据库中获取 _id (主键),并且该标记是marker_model对象的实例并且
marker_model有方法getTitle
和getDescription
,它们返回一个带有相应值的字符串,然后沿着以下行的某些东西就可以了。
public long getMarkerPrimaryId(Marker marker){
long rv = 0;
SQLiteDatabase db = getReadableDatabase();
String[] columns = new String[]{Constans.My_MARKER_ID};
String whereclause = Constans.MARKER_TITLE + "=?" +
Constans.MARKER_DESCRIPTION + "=?";
String[] whereargs = new String[]{
marker.getTitile,
marker.getDescription
}
Cursor cursor = db.query(Constans.TABLE_NAME,
columns,
whereclause,
whereargs,
null,null,null);
if (cursor.getCount() > 0) {
cursor.moveToFirst();
rv = cursor.getLong(cursor.getColumnIndex(Constans.My_MARKER_ID);
}
cursor.close;
db.close;
return rv;
}
但是,如果您的问题是getMarkers
未正确设置 Id 成员(即匹配数据库中的ID),则更改model.set_Id(_ID);
到
model.set_Id(cursor.getLong(cursor.getColumnIndex(Constans.My_MARKER_ID));
就足够了。
如果您希望使用自动生成的递增 _id ,addMarker
有点瑕疵。只需删除行values.put(Constans.My_MARKER_ID,marker.get_Id());
,就会自动生成_id(这往往是如何使用_id)。
以下(主要是背景段落)解释了很多关于自动生成的唯一标识符(即使它是关于AUTOINCREMENT你可能不想编码AUTOINCREMENT)。
我建议不要: -
if (cursor.moveToFirst()){
do {
...
}while(cursor.moveToNext());
使用: - while(cursor.moveToNext(){ .... }
更简单(光标,在创建时,将定位到第一行之前( moveToPosition(-1)
具有相同的效果),{{1}将在第一次移动到第一行,如果没有行,则不会输入循环(您可能希望考虑这个以及返回的moveToNext()
的状态))。
请注意!上面的内容是在没有经过测试的情况下编写的,因此可能存在一些奇怪的错误。