正确插入和从 sqlite 获取数据 android
properly inserting and getting data from sqlite android
嗨,我是 android 的新手,所以我有这个功能需要从我的数据库中添加和检索。到目前为止,这是我所拥有的,所以我有这组 java 文件
newLoc.java 包含用户单击保存按钮时响应的代码。 Area.java 包含 getter 和 setter。 DBHandler.java 有数据库的东西。
在添加区域我已经记录了它以便我可以检查它是否被添加。问题出在我阅读 table 时。在我的 newLoc.java 中,我还调用了 getALLAREA 函数来检查是否插入了记录,但我得到的唯一输出是数据库中记录的 ID 知道我做错了什么吗?
代码在这里
newLoc.java
以下是用户单击保存按钮时响应的代码。它从 editText 获取数据然后调用 DBHanlder 添加数据
public void onClick(View v)
{
String text ="user created";
Toast tempMessage =
Toast.makeText(newLoc.this,
text,
Toast.LENGTH_SHORT);
tempMessage.show();
areaname = narea.getText().toString();
DBHandler db = new DBHandler(newLoc.this);
Log.d("Insert: ", "Inserting .." + areaname);
db.addNArea( new Area(areaname));
Log.d("Reading: " , "Reading users..");
List<Area> area = db.getALLAREA();
for(Area ar : area)
{
String arean = ar.getArea();
Log.d("Areas" , arean);
}
}
Area.java
这是我的 getter 和 setter 来自
public class Area
{
private int arID;
private String narea;
public Area()
{
}
public Area(String area)
{
this.narea = area;
}
public void setArea(String area)
{
this.narea = area;
}
public String getArea()
{
return narea;
}
}
DBHandeler.java
这是完成数据库工作的地方。在 addNArea
中,我在 try 中放了一个日志,以检查是否添加了数据。日志正在打印来自用户的数据,所以我认为它是正确插入的,因为我无法从日志中看到错误
public void addNArea(Area are)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ANAME, are.getArea());
try
{
db.insert(TABLE_AREA, null, values);
Log.d("Insert: ", "Inserting .." + are.getArea());
}
catch (SQLException e)
{
Log.d("error: " , "" + e);
}
db.close();
}
//view areas
public List<Area> getALLAREA()
{
List<Area> arealist = new ArrayList<Area>();
String selectQuery = "SELECT * FROM " + TABLE_AREA;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Area allarea = new Area();
allarea.setArea(cursor.getString(0));
arealist.add(allarea);
} while (cursor.moveToNext());
}
return arealist;
}
所以现在的问题是在我的 newLoc.java
中我看不到我添加的区域列表。关于我做错了什么的任何想法?非常感谢!
你不应该使用
'SELECT *'
使用:
'SELECT KEY_ANAME'
这就是为什么:
通过创建内容值
values.put(KEY_ANAME, are.getArea())
数据库驱动程序将生成:
INSERT INTO tabname (col1) values ('my area name')
如果你定义了
KEY_ANAME = "col1"
也许这就是你真正想做的:
假设你的 table 有这样的定义:
TArea (pk_area int pkey, area_name varchar(100))
您的插入内容应如下所示:
private static final String COL_NAME = "area_name";
private static final String PKEY = "pk_area";
private static final String TAB_AREA = "TArea";
...
values.put(COL_NAME, are.getArea())
你的 select 喜欢:
String sql = "SELECT " + PKEY +", "+ COL_NAME + " FROM " + TAB_AREA;
Cusor cur = db.rawQuerry(sql, null);
...
int id = cur.getInt(0);
String name = getString.get(1);
嗨,我是 android 的新手,所以我有这个功能需要从我的数据库中添加和检索。到目前为止,这是我所拥有的,所以我有这组 java 文件 newLoc.java 包含用户单击保存按钮时响应的代码。 Area.java 包含 getter 和 setter。 DBHandler.java 有数据库的东西。 在添加区域我已经记录了它以便我可以检查它是否被添加。问题出在我阅读 table 时。在我的 newLoc.java 中,我还调用了 getALLAREA 函数来检查是否插入了记录,但我得到的唯一输出是数据库中记录的 ID 知道我做错了什么吗? 代码在这里
newLoc.java
以下是用户单击保存按钮时响应的代码。它从 editText 获取数据然后调用 DBHanlder 添加数据
public void onClick(View v)
{
String text ="user created";
Toast tempMessage =
Toast.makeText(newLoc.this,
text,
Toast.LENGTH_SHORT);
tempMessage.show();
areaname = narea.getText().toString();
DBHandler db = new DBHandler(newLoc.this);
Log.d("Insert: ", "Inserting .." + areaname);
db.addNArea( new Area(areaname));
Log.d("Reading: " , "Reading users..");
List<Area> area = db.getALLAREA();
for(Area ar : area)
{
String arean = ar.getArea();
Log.d("Areas" , arean);
}
}
Area.java
这是我的 getter 和 setter 来自
public class Area
{
private int arID;
private String narea;
public Area()
{
}
public Area(String area)
{
this.narea = area;
}
public void setArea(String area)
{
this.narea = area;
}
public String getArea()
{
return narea;
}
}
DBHandeler.java
这是完成数据库工作的地方。在 addNArea
中,我在 try 中放了一个日志,以检查是否添加了数据。日志正在打印来自用户的数据,所以我认为它是正确插入的,因为我无法从日志中看到错误
public void addNArea(Area are)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_ANAME, are.getArea());
try
{
db.insert(TABLE_AREA, null, values);
Log.d("Insert: ", "Inserting .." + are.getArea());
}
catch (SQLException e)
{
Log.d("error: " , "" + e);
}
db.close();
}
//view areas
public List<Area> getALLAREA()
{
List<Area> arealist = new ArrayList<Area>();
String selectQuery = "SELECT * FROM " + TABLE_AREA;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
Area allarea = new Area();
allarea.setArea(cursor.getString(0));
arealist.add(allarea);
} while (cursor.moveToNext());
}
return arealist;
}
所以现在的问题是在我的 newLoc.java
中我看不到我添加的区域列表。关于我做错了什么的任何想法?非常感谢!
你不应该使用
'SELECT *'
使用:
'SELECT KEY_ANAME'
这就是为什么: 通过创建内容值
values.put(KEY_ANAME, are.getArea())
数据库驱动程序将生成:
INSERT INTO tabname (col1) values ('my area name')
如果你定义了
KEY_ANAME = "col1"
也许这就是你真正想做的: 假设你的 table 有这样的定义:
TArea (pk_area int pkey, area_name varchar(100))
您的插入内容应如下所示:
private static final String COL_NAME = "area_name";
private static final String PKEY = "pk_area";
private static final String TAB_AREA = "TArea";
...
values.put(COL_NAME, are.getArea())
你的 select 喜欢:
String sql = "SELECT " + PKEY +", "+ COL_NAME + " FROM " + TAB_AREA;
Cusor cur = db.rawQuerry(sql, null);
...
int id = cur.getInt(0);
String name = getString.get(1);