2015-10-28 57 views
6

特にaddButtonClicked()メソッドとDBHandler自体を調べました。なぜ私はデータベースに何かを追加しようとすると、プログラムが基本的に無限ループに陥るのを理解できません。私はそれを実行し、データベースに何かを追加しようとするたびに、それは凍結し、このメッセージを何度も何度も繰り返し与えます。データベースを持つAndroidアプリ "blocking/gc allocを開始/待機中"

エラー:それはちょうどそれがテキストビューに表示されないので、何度も繰り返しとprintSelectedDatabase()が実行されることはありませんことを実行し続ける

10-27 20:34:50.303 2849-2849/? I/art: Not late-enabling -Xcheck:jni (already on) 
10-27 20:34:50.303 2849-2849/? I/art: Late-enabling JIT 
10-27 20:34:50.312 2849-2849/? I/art: JIT created with code_cache_capacity=2MB compile_threshold=1000 
10-27 20:34:50.408 2849-2849/com.example.test.assignment W/System: ClassLoader referenced unknown path: /data/app/com.example.test.assignment-2/lib/x86 
10-27 20:34:50.966 2849-2860/com.example.test.assignment W/art: Suspending all threads took: 6.223ms 
10-27 20:34:51.033 2849-2860/com.example.test.assignment I/art: Background partial concurrent mark sweep GC freed 423(15KB) AllocSpace objects, 418(7MB) LOS objects, 38% free, 6MB/10MB, paused 6.686ms total 54.772ms 
10-27 20:34:51.577 2849-2860/com.example.test.assignment W/art: Suspending all threads took: 6.097ms 
10-27 20:34:51.816 2849-2860/com.example.test.assignment I/art: WaitForGcToComplete blocked for 11.994ms for cause Background 
10-27 20:34:52.017 2849-2860/com.example.test.assignment W/art: Suspending all threads took: 9.393ms 
10-27 20:34:52.023 2849-2860/com.example.test.assignment I/art: Background sticky concurrent mark sweep GC freed 845(30KB) AllocSpace objects, 843(41MB) LOS objects, 76% free, 1233KB/5MB, paused 10.623ms total 31.789ms 
10-27 20:34:52.132 2849-2860/com.example.test.assignment I/art: Background partial concurrent mark sweep GC freed 752(27KB) AllocSpace objects, 747(37MB) LOS objects, 15% free, 21MB/25MB, paused 20.980ms total 40.058ms 
10-27 20:34:53.000 2849-2849/com.example.test.assignment I/art: Waiting for a blocking GC Alloc 
10-27 20:34:53.001 2849-2849/com.example.test.assignment I/art: Starting a blocking GC Alloc 
10-27 20:34:53.123 2849-2849/com.example.test.assignment I/art: Waiting for a blocking GC Alloc 
10-27 20:34:53.126 2849-2849/com.example.test.assignment I/art: Starting a blocking GC Alloc 
10-27 20:34:53.195 2849-2849/com.example.test.assignment I/art: Waiting for a blocking GC Alloc 
10-27 20:34:53.205 2849-2849/com.example.test.assignment I/art: WaitForGcToComplete blocked for 10.178ms for cause Alloc 

主な活動:

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 
    EditText dataInput; 
    TextView showText; 
    DBHandler dbHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     dataInput = (EditText) findViewById(R.id.dataInput); 
     showText = (TextView) findViewById(R.id.showText); 
     dbHandler = new DBHandler(this, null, null, 1); 
     printSelectedDatabase(); 
    } 

    public void addButtonClicked(View view){ 
     Animals animal = new Animals(dataInput.getText().toString()); 
     dbHandler.addAnimal(animal); 
     printSelectedDatabase(); 
    } 

    public void deleteButtonClicked(View view){ 
     String string = dataInput.getText().toString(); 
     dbHandler.deleteAnimal(string); 
     printSelectedDatabase(); 
    } 

    public void printSelectedDatabase(){ 
     String string = dbHandler.printDatabase(); 
     showText.setText(string); 
     dataInput.setText(""); 
    } 
} 

セッター/ゲッター:

public class Animals { 

    private int _id; 
    private String _animalName; 

    public Animals(){ 

    } 

    public Animals(String animalName) { 
     this._animalName = animalName; 
    } 

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

    public void set_animalname(String _animalName) { 
     this._animalName = _animalName; 
    } 

    public int get_id() { 
     return _id; 
    } 

    public String get_animalName() { 
     return _animalName; 
    } 
} 

DBHandler:

import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.Cursor; 
import android.content.Context; 
import android.content.ContentValues; 

public class DBHandler extends SQLiteOpenHelper { 

    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "animals.db"; 
    public static final String TABLE_ANIMALS = "animals"; 
    public static final String COLUMN_ID = "_id"; 
    public static final String COLUMN_ANIMALS = "animalName"; 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String query = "CREATE TABLE " + TABLE_ANIMALS + "(" + 
       COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       COLUMN_ANIMALS + " TEXT " + 
       ");"; 
     db.execSQL(query); 
    } 

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

    //Add Animal 
    public void addAnimal(Animals animal){ 
     ContentValues values = new ContentValues(); 
     values.put(COLUMN_ANIMALS, animal.get_animalName()); 
     SQLiteDatabase db = getWritableDatabase(); 
     db.insert(TABLE_ANIMALS, null, values); 
     db.close(); 
    } 
    //Delete Animal 
    public void deleteAnimal(String animalName){ 
     SQLiteDatabase db = getWritableDatabase(); 
     db.execSQL("DELETE FROM " + TABLE_ANIMALS + " WHERE " + COLUMN_ANIMALS + "=\"" + animalName + "\";"); 
    } 

    //Print Animals 
    public String printDatabase(){ 
     String string = ""; 
     SQLiteDatabase db = getWritableDatabase(); 
     String query = "SELECT * FROM " + TABLE_ANIMALS + " WHERE 1"; 
     Cursor cursor = db.rawQuery(query, null); 
     cursor.moveToFirst(); 
     while(!cursor.isAfterLast()){ 
      if(cursor.getString(cursor.getColumnIndex("animalName"))!=null){ 
       string += cursor.getString(cursor.getColumnIndex("animalName")); 
       string += "\n"; 
      } 
     } 
     db.close(); 
     return string; 
    } 


} 

答えて

6

は、誰もがこの特定のエラーに遭遇してしまった場合にはそれを考え出しました。私のDBHandlerでは、while文の中で次の行に行かなくなりました。

オリジナル:

while(!cursor.isAfterLast()){ 
       if(cursor.getString(cursor.getColumnIndex("animalName"))!=null){ 
        string += cursor.getString(cursor.getColumnIndex("animalName")); 
        string += "\n"; 
       } 
      } 

は次のようになります。

while(!cursor.isAfterLast()){ 
      if(cursor.getString(cursor.getColumnIndex("animalName"))!=null){ 
       string += cursor.getString(cursor.getColumnIndex("animalName")); 
       string += "\n"; 
      } 
      cursor.moveToNext(); 
     } 
2

ちょうどあなたの答えに追加します。代わりに:

while(!cursor.isAfterLast()){ 
    // do stuff with cursor 
    cursor.moveToNext(); 
} 

あなたのコードはより簡潔で次のようになります。

while (cursor.moveToNext()) { 
    // do stuff with cursor 
} 

クエリを実行すると、カーソルオブジェクトが最初のエントリの前に配置されます。 cursor.moveToNext()の呼び出しは次の位置に移動し、実際に移動するレコードがある場合はtrue、それ以外の場合はfalseを返します。

また、ループ内からcursor.getColumnIndex("columnName")を呼び出すことも避けてください。 int型変数の列インデックスをキャッシュし、ループ内のその変数を参照するほうがよいでしょう。

int animalNameColumn = cursor.getColumnIndex("animalName"); 
while (cursor.moveToNext()) { 
     if(cursor.getString(animalNameColumn)!=null){ 
      string += cursor.getString(animalNameColumn); 
      string += "\n"; 
     } 
} 
関連する問題