在数据库中搜索特定记录时出错
Error in searching a database for a particular record
我有一个名为 TABLE_CONTENTS
的 SQLite 数据库 table,由 contact
类型的对象组成。每个 contact
有 2 个变量:int id
和 String name
。我想在 SQLite 数据库 table 中搜索特定的 ID。为此,我在 class DatabaseHandler
中创建了 isPresent()
方法。它需要一个 int
id 并相应地搜索 table 和 returns true
或 false
中是否存在具有 id
的对象。
以下代码创建了一个数据库,并使用 id
s 1
和 2
添加了 2 个对象。然后它尝试使用 isPresent()
搜索 id=3
。这应该 return false
导致文本 id 3 is absent
显示。但是,它是 returning true
并且显示的文本是 id 3 is present
.
这段代码有什么问题? isPresent()
的正确代码是什么?
MainActivity.java
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseHandler db = new DatabaseHandler(this);
// Inserting Contacts
db.addContact(new Contact(1, "one"));
db.addContact(new Contact(2, "two"));
TextView text=(TextView) findViewById(R.id.text);
text.setText(db.isPresent(3) ? "id 3 is present" : "id 3 is absent");
}
DatabaseHandler.java
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHandler extends SQLiteOpenHelper
{
private static final int DATABASE_VERSION=1;
private static final String DATABASE_NAME="contactsManager";
private static final String TABLE_CONTACTS="contacts";
private static final String KEY_ID="id";
private static final String KEY_NAME="name";
public DatabaseHandler(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);}
@Override
public void onCreate(SQLiteDatabase db)
{
String CREATE_CONTACTS_TABLE="CREATE TABLE "+TABLE_CONTACTS+"("+KEY_ID+" INTEGER PRIMARY KEY, "+KEY_NAME+" TEXT "+")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS"+TABLE_CONTACTS);
onCreate(db);
}
void addContact(Contact contact)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.name);
values.put(KEY_ID, contact.id);
// Inserting Row
db.insert(TABLE_CONTACTS, null, values);
//2nd argument is String containing nullColumnHack
db.close(); // Closing database connection
}
// not working properly..always returning true
public boolean isPresent(int id)
{
SQLiteDatabase sqldb = this.getReadableDatabase();
String Query = "Select * from " + TABLE_CONTACTS ;
Cursor cursor = sqldb.rawQuery(Query, null);
cursor.moveToLast(); //if you not place this cursor.getCount() always give same integer (1) or current position of cursor.
if(cursor.getCount()<=0)
{
return false;
}
return true;
}
Contact getContact(int id)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME}, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1));
// return contact
return contact;
}
public int updateContact(Contact contact)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.name);
// updating row
return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
new String[] { String.valueOf(contact.id) });
}
}
}
联系class
public class Contact
{
public String name;
public int id;
Contact(int id, String name)
{
this.id=id;
this.name=name;
}
}
试试,
据我所知,您没有向 select 特定行添加任何条件。所以,它就像得到所有不是 selected 的一个。所以,cursor.getCount() <= 0 总是 false 因为你已经添加了 2 条记录。
在 isPresent(int id) 方法中更新查询如下并尝试一次,
String Query = "Select * from " + TABLE_CONTACTS + " WHERE " + KEY_ID + "='"+ id + "'";
您尚未在查询中添加任何 WHERE 子句 以根据 ID 搜索记录,因此它总是 select 您的所有行数据库总是 return 计数 >0,所以这就是你的代码不起作用的原因。
您必须修改 Select 查询以在其中包含类似这样的 WHERE 子句。
String yourQuery= "Select * from " + TABLE_CONTACTS + " WHERE " + KEY_ID + "='"+ id + "'";
我有一个名为 TABLE_CONTENTS
的 SQLite 数据库 table,由 contact
类型的对象组成。每个 contact
有 2 个变量:int id
和 String name
。我想在 SQLite 数据库 table 中搜索特定的 ID。为此,我在 class DatabaseHandler
中创建了 isPresent()
方法。它需要一个 int
id 并相应地搜索 table 和 returns true
或 false
中是否存在具有 id
的对象。
以下代码创建了一个数据库,并使用 id
s 1
和 2
添加了 2 个对象。然后它尝试使用 isPresent()
搜索 id=3
。这应该 return false
导致文本 id 3 is absent
显示。但是,它是 returning true
并且显示的文本是 id 3 is present
.
这段代码有什么问题? isPresent()
的正确代码是什么?
MainActivity.java
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DatabaseHandler db = new DatabaseHandler(this);
// Inserting Contacts
db.addContact(new Contact(1, "one"));
db.addContact(new Contact(2, "two"));
TextView text=(TextView) findViewById(R.id.text);
text.setText(db.isPresent(3) ? "id 3 is present" : "id 3 is absent");
}
DatabaseHandler.java
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHandler extends SQLiteOpenHelper
{
private static final int DATABASE_VERSION=1;
private static final String DATABASE_NAME="contactsManager";
private static final String TABLE_CONTACTS="contacts";
private static final String KEY_ID="id";
private static final String KEY_NAME="name";
public DatabaseHandler(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);}
@Override
public void onCreate(SQLiteDatabase db)
{
String CREATE_CONTACTS_TABLE="CREATE TABLE "+TABLE_CONTACTS+"("+KEY_ID+" INTEGER PRIMARY KEY, "+KEY_NAME+" TEXT "+")";
db.execSQL(CREATE_CONTACTS_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
db.execSQL("DROP TABLE IF EXISTS"+TABLE_CONTACTS);
onCreate(db);
}
void addContact(Contact contact)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.name);
values.put(KEY_ID, contact.id);
// Inserting Row
db.insert(TABLE_CONTACTS, null, values);
//2nd argument is String containing nullColumnHack
db.close(); // Closing database connection
}
// not working properly..always returning true
public boolean isPresent(int id)
{
SQLiteDatabase sqldb = this.getReadableDatabase();
String Query = "Select * from " + TABLE_CONTACTS ;
Cursor cursor = sqldb.rawQuery(Query, null);
cursor.moveToLast(); //if you not place this cursor.getCount() always give same integer (1) or current position of cursor.
if(cursor.getCount()<=0)
{
return false;
}
return true;
}
Contact getContact(int id)
{
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
KEY_NAME}, KEY_ID + "=?",
new String[] { String.valueOf(id) }, null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Contact contact = new Contact(Integer.parseInt(cursor.getString(0)),
cursor.getString(1));
// return contact
return contact;
}
public int updateContact(Contact contact)
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.name);
// updating row
return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
new String[] { String.valueOf(contact.id) });
}
}
}
联系class
public class Contact
{
public String name;
public int id;
Contact(int id, String name)
{
this.id=id;
this.name=name;
}
}
试试,
据我所知,您没有向 select 特定行添加任何条件。所以,它就像得到所有不是 selected 的一个。所以,cursor.getCount() <= 0 总是 false 因为你已经添加了 2 条记录。
在 isPresent(int id) 方法中更新查询如下并尝试一次,
String Query = "Select * from " + TABLE_CONTACTS + " WHERE " + KEY_ID + "='"+ id + "'";
您尚未在查询中添加任何 WHERE 子句 以根据 ID 搜索记录,因此它总是 select 您的所有行数据库总是 return 计数 >0,所以这就是你的代码不起作用的原因。
您必须修改 Select 查询以在其中包含类似这样的 WHERE 子句。
String yourQuery= "Select * from " + TABLE_CONTACTS + " WHERE " + KEY_ID + "='"+ id + "'";