【发布时间】:2015-02-24 01:31:02
【问题描述】:
我正在尝试基于 vogella 教程 http://www.vogella.com/tutorials/AndroidSQLite/article.html 实现一个稍微简单的 SQLite 数据库。
下面的数据库很简单,我只有1列COLUMN_TOPIC,我设置为TEXT PRIMARY KEY NOT NULL。
我遇到的问题是关于我提出的 CRUD 操作。我无法使用
行检索单个主题对象Cursor cursor = database.query(TopicDBHelper.TABLE_TOPICS, allColumns,
TopicDBHelper.COLUMN_TOPIC + " = " + "'" + topic + "'", null, null, null, null); if (cursor
!= null && cursor.moveToFirst()) { newTopic = cursorToTopic(cursor);
我无法使用 getAllTopics() 方法检索所有主题。返回的值为NULL
根据我的发现,可以使用字符串或文本作为主键,尽管不一定推荐。
我尝试访问数据库的方式有什么问题吗?还是我尝试执行的 SQL 有问题?
这就是我调用相关数据库操作的方式
MQTTServiceDelegate.addTopicToDB(this, "ALL");
MQTTServiceDelegate.getAllTopicsFromDB(this);
这里是 MQTTServiceDelegate
public static void addTopicToDB(Context context, String topicName) {
TopicsDataSource datasource = new TopicsDataSource(context);
datasource.open();
datasource.createTopic(topicName);
datasource.close();
}
public static void removeTopicFromDB(Context context, String topicName) {
TopicsDataSource datasource = new TopicsDataSource(context);
datasource.open();
datasource.deleteTopic(topicName);
datasource.close();
}
public static void getAllTopicsFromDB(Context context){
TopicsDataSource datasource = new TopicsDataSource(context);
datasource.open();
datasource.getAllTopics();
datasource.close();
}
TopicDBHelper
public static final String TABLE_TOPICS = "topics";
public static final String COLUMN_TOPIC = "topic";
public static final String COLUMN_TOPIC_ID = "topic_id";
private static final String DATABASE_NAME = "topics.db";
private static final int DATABASE_VERSION = 1;
// Database creation sql statement
private static final String DATABASE_CREATE = "create table "
+ TABLE_TOPICS + "(" + COLUMN_TOPIC
+ " text primary key not null);";
public TopicDBHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.w(TopicDBHelper.class.getName(),
"Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS " + TABLE_TOPICS);
onCreate(db);
}
TopicDataSource
// Database fields
private SQLiteDatabase database;
private TopicDBHelper dbHelper;
private String[] allColumns = {TopicDBHelper.COLUMN_TOPIC};
public TopicsDataSource(Context context) {
dbHelper = new TopicDBHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public void createTopic(String topic) {
Topic newTopic = null;
ContentValues values = new ContentValues();
values.put(TopicDBHelper.COLUMN_TOPIC, topic);
/*
* Cursor cursor = database.query(TopicDBHelper.TABLE_TOPICS, allColumns,
* TopicDBHelper.COLUMN_TOPIC + " = " + "'" + topic + "'", null, null, null, null); if (cursor
* != null && cursor.moveToFirst()) { newTopic = cursorToTopic(cursor); cursor.close();
* Log.e("CURSOR", newTopic.get_topicName());
*
* } Log.e("CURSOR", "" + newTopic.get_topicName());
*/
/* return newTopic; */
}
public void deleteTopic(String topicName) {
database.delete(TopicDBHelper.TABLE_TOPICS, TopicDBHelper.COLUMN_TOPIC + " = " + topicName,
null);
}
public List<Topic> getAllTopics() {
List<Topic> topics = new ArrayList<Topic>();
Cursor cursor = database.rawQuery("SELECT * FROM " + TopicDBHelper.TABLE_TOPICS, null);
/*
* Cursor cursor = database.query(TopicDBHelper.TABLE_TOPICS, allColumns, null, null, null,
* null, null);
*/
if (cursor.moveToFirst()) {
while (!cursor.isAfterLast()) {
Topic topic = cursorToTopic(cursor);
Log.e("GET ALL TOPICS", "" + topic.get_topicName());
topics.add(topic);
cursor.moveToNext();
}
// make sure to close the cursor
cursor.close();
}
return topics;
}
private Topic cursorToTopic(Cursor cursor) {
Topic topic = new Topic();
topic.set_topicName(cursor.getString(1));
return topic;
}
【问题讨论】:
-
在执行 INSERT、UPDATE 和 DELETE 时,您需要处于事务中……如果您发现一切正常,则提交该事务。您不需要 SELECT 上的事务。
-
"'" + topic + "'"<= this is so bad(漏洞利用并不是它如此糟糕的唯一原因)