Я пытаюсь реализовать несколько простую базу данных SQLite, основанную на уроке vogella http://www.vogella.com/tutorials/AndroidSQLite/article.html.SQLite CRUD Issue
База данных ниже очень проста, и у меня есть только 1 столбец COLUMN_TOPIC, который я установил в ТЕКСТ ПЕРВИЧНЫЙ КЛЮЧ НЕ НУЛЬ.
Вопрос, который у меня есть, касается действий 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 вы должны быть в транзакции ... и COMMIT эту транзакцию, если найдете все в порядке. Для SELECT не требуется транзакция. –
['" '"+ topic +"' "' <= это так плохо] (http://xkcd.com/327/) (а эксплойты - не единственная причина, почему это так плохо) – Selvin