2015-06-10 4 views
2

Вопрос Следующее руководство, пытаясь вставить какую-то простую строку в базу данных каждый раз, когда я нажимаю кнопку. Я считаю, что «имена пользователей» вводятся в базу данных, а отладка не делает ничего смешного. Моя проблема в том, когда я хочу позвонить databaseToString(), я установил курсор для первой записи. Но впоследствии он даже не входит в while(!c.isAfterLast()). Что происходит? Я хочу, чтобы dbString в значительной степени был равен базе данных в виде открытого текста, но этого не происходит. БлагодарностиАндроид while! C.isAfterLast() не вводится

Попытки

  • Проверено около SO/Google/API источник руководство/thenewboston код
  • Пробовал просмотра моей базы данных SQLite, но я не уверен, как это сделать, так что я не мог
  • Если вы закомментируете базу данныхToString, я думаю, она работает, но она просто сидит там.
  • Он также падает, когда я установил Text.setText(dbString);, но это никак не связано

LogCat Он не откажет, если это необходимо, я выложу.

SearchActivity.Java ВСТАВИТЬ вызывается при нажатии кнопки

public class SearchActivity extends ActionBarActivity { 

    EditText Input; 
    TextView Text; 
    Database dbHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_search); 

     Input = (EditText) findViewById(R.id.Input); 
     dbHandler = new Database(this, null, null, 1); 
     // printDatabase(); 

    } 

    // Add a user to database 
    public void insert(View view) { 
     Users user = new Users(Input.getText().toString()); 
     dbHandler.addUser(user); 
     printDatabase(); 
    } 


    public void printDatabase() { 
     // dbString is returning null 
     String dbString = dbHandler.databaseToString(); 
     //Technically it starts to crash right at this line 
     Text.setText(dbString); 
     Input.setText(""); 
    }  
} 

Users.java

public class Users { 
    private int _id; 
    private String _username; 

    public Users() { 

    } 

    public Users(String username){ 
     this._username = username; 
    } 

    public String get_username() { 
     return _username; 
    } 

    public void set_username(String username) { 
     this._username = username; 
    } 

    public int get_id() { 
     return _id; 
    } 

    public void set_id(int id) { 
     this._id = id; 
    } 
} 

Database.java ака Handler. Посмотрите на databaseToString(), и цикл while по какой-то причине не вводится.

public class Database extends SQLiteOpenHelper { 
    // Version number to upgrade database version 
    // each time if you Add, Edit table, you need to change 
    // the version number 
    private static final int DATABASE_VERSION = 2; 
    private static final String DATABASE_NAME = "users.db"; 
    private static final String TABLE_USERS = "users"; 
    public static final String COLUMN_ID = "_id"; 
    public static final String COLUMN_USERNAME = "username"; 


    public Database(Context context, String DATABASE_NAME, SQLiteDatabase.CursorFactory factory, int version) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // There must be a ',' in between every column definition 
     String query = "CREATE TABLE " + TABLE_USERS + "(" + 
       COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       COLUMN_USERNAME + " TEXT " + 
       ");"; 
     db.execSQL(query); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS" + TABLE_USERS); 
     onCreate(db); 
    } 

    //Add a new row to the db 
    public void addUser(Users user){ 
     ContentValues values = new ContentValues(); 
     values.put(COLUMN_USERNAME, user.get_username()); 
     SQLiteDatabase db = getWritableDatabase(); 
     db.insert(TABLE_USERS, null, values); 
     db.close(); 
    } 

    public String databaseToString() { 
     String dbString = ""; 
     SQLiteDatabase db = getWritableDatabase(); 
     String query = "SELECT * FROM " + TABLE_USERS + " WHERE 1"; 

     // Cursor point to a location in your results 
     Cursor c = db.rawQuery(query, null); 
     // Move to the first row in your results 
     c.moveToFirst(); 

     while(!c.isAfterLast()) { 
      if(c.getString(c.getColumnIndex("username")) != null) { 
       dbString += c.getString(c.getColumnIndex("username")); 
       dbString += "\n"; 
      } 
     } 
     db.close(); 
     return dbString; 
    } 
} 
+2

Получите возвращаемое значение вставки и посмотрите, что он возвращает. Если он возвращает -1, это означает, что он не был успешным. 'long retVal = db.insert (TABLE_USERS, null, values);' –

+0

@ DanielNugent Спасибо за этот замечательный отзыв. У меня есть retVal = 14. По крайней мере, я знаю, что он работает сейчас, спасибо –

+2

Конечно. Следующее, что нужно проверить, - это возвращаемое значение getCount() в курсоре после вызова rawQuery: 'int count = c.getCount()' –

ответ

2

Крепление NullPointerException:

Во-первых, чтобы исправить NullPointerException, инициализировать Text в onCreate():

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_search); 

    Input = (EditText) findViewById(R.id.Input); 
    Text = (TextView) findViewById(R.id.Text); //added 
    dbHandler = new Database(this, null, null, 1); 
    // printDatabase(); 

} 

Debugging советы:

Для того, чтобы убедиться в том, что введение в базу данных успешно, захватить возвращаемое значение insert():

long retVal = db.insert(TABLE_USERS, null, values); 

Затем, чтобы проверить, что данные присутствуют в Cursor, получить количество Курсора:

Cursor c = db.rawQuery(query, null); 
int count = c.getCount(); //added 

Решение:

Наконец, есть несколько вещей, чтобы добавить здесь. Во-первых, вам нужно продвигать курсор, чтобы не иметь бесконечного цикла. Кроме того, вы должны проверить возвращаемое значение moveToFirst() и ничего не делать, если оно возвращает false. Наконец, вы должны закрыть Курсор, когда закончите с ним, иначе у вас будет утечка памяти.

public String databaseToString() { 
    String dbString = ""; 
    SQLiteDatabase db = getWritableDatabase(); 
    String query = "SELECT * FROM " + TABLE_USERS + " WHERE 1"; 

    // Cursor point to a location in your results 
    Cursor c = db.rawQuery(query, null); 
    // Move to the first row in your results 
    //check that moveToFirst returns true 
    if (c.moveToFirst()){ 

     while(!c.isAfterLast()) { 
     if(c.getString(c.getColumnIndex("username")) != null) { 
      dbString += c.getString(c.getColumnIndex("username")); 
      dbString += "\n"; 
     } 
     c.moveToNext(); //added 
     } 

    } 
    c.close(); //added 
    db.close(); 
    return dbString; 
} 
1

Может быть, это поможет вам:

Самый простой способ заключается в следующем:

while (cursor.moveToNext()) { 
    ... 
} 

Курсор начинает перед тем первый результирующий ряд, так что на первом итерации этого движения до первого результата если есть. Если курсор пуст или последняя строка уже обработана, то петля выходит аккуратно.

What's the best way to iterate an Android Cursor?

+0

Извините, он все еще не входит в цикл –

Смежные вопросы