2015-02-23 3 views
0

Я пытаюсь реализовать несколько простую базу данных 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; 
    } 
+0

при выполнении INSERT, UPDATE и DELETE вы должны быть в транзакции ... и COMMIT эту транзакцию, если найдете все в порядке. Для SELECT не требуется транзакция. –

+1

['" '"+ topic +"' "' <= это так плохо] (http://xkcd.com/327/) (а эксплойты - не единственная причина, почему это так плохо) – Selvin

ответ

0

Колонка индексации в курсоре с нуля. Поскольку существует только один столбец, getString(1) в вашем cursorToTopic() относится к столбцу, который не существует, и может быть возвращен null.

Вместо этого следует изменить его на getString(0).

С кодом возникает ряд других проблем; их покрытие, возможно, слишком велико для переполнения стека.