2016-04-09 10 views
0

私のアプリでは、メモの書き込み、保存、削除ができる基本的なSQLiteアクティビティを作成しようとしています。最初の実行で私はアクティビティを開いてメモを書き込むことができましたが、追加ボタンが押されるとアプリケーションが凍りついて最終的にクラッシュし、フォローアップ実行時にアクティビティを開始しようとするとフリーズします。すべてのスレッドを中断ました::16::51.171 24190から24196/com.test.test.appのW /アートアンドロイドmoniterは私にSQLiteのエントリー時のアンドロイドアプリケーションの凍結

04-09 17の流れを与えている6.236ms

エラー。何か案は?

MyDbHandlerクラス

package com.test.test.app; 

import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.Cursor; 
import android.content.Context; 
import android.content.ContentValues; 
public class MyDbHandler extends SQLiteOpenHelper{ 


    private static final int DATABASE_VERSION = 1; 
    private static final String DATABASE_NAME = "Memos.db"; 
    public static final String TABLE_MEMOS = "Memos"; 
    public static final String COLUMN_ID = "_id"; 
    public static final String COLUMN_LYRICS = "lyrics"; 

    public MyDbHandler(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_MEMOS + "(" + 
       COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
       COLUMN_LYRICS + " TEXT" + 
       ");"; 
     db.execSQL(query); 
    } 

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

    //add a new row to the database 
    public void addLyric(Memos lyrics) { 
     ContentValues values = new ContentValues(); 
     values.put(COLUMN_LYRICS, lyrics.get_lyrics()); 
     SQLiteDatabase db = getWritableDatabase(); 
     db.insert(TABLE_MEMOS, null, values); 
     db.close(); 
    } 

    //delete product from database 
    public void deleteLyrics (String lyrics){ 
     SQLiteDatabase db = getWritableDatabase(); 
     db.execSQL("DELETE FROM " + TABLE_MEMOS + " WHERE " + COLUMN_LYRICS + "=\"" + lyrics + "\";"); 
    } 


    //print out database as string 
    public String databaseToString(){ 
     String dbString = ""; 
     SQLiteDatabase db = getWritableDatabase(); 
     String query = "SELECT * FROM " + TABLE_MEMOS + " WHERE 1"; 

     //cursor point to result 
     Cursor c = db.rawQuery(query, null); 
     //first row 
     c.moveToFirst(); 

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

MemoActivityクラス

package com.test.test.app; 

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

import com.test.test.app.MyDbHandler; 

public class MemoActivity extends ActionBarActivity { 

    EditText uInput; 
    TextView uText; 
    MyDbHandler dbHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_memo); 
     uInput = (EditText) findViewById(R.id.uInput); 
     uText = (TextView) findViewById(R.id.uText); 
     dbHandler = new MyDbHandler(this, null, null, 1); 
     printDatabase(); 
    } 

    public void addButtonClicked(View view){ 
     Memos lyrics = new Memos(uInput.getText().toString()); 
     dbHandler.addLyric(lyrics); 
     printDatabase(); 
    } 

    public void deleteButtonClicked(View view){ 
     String inputText = uInput.getText().toString(); 
     dbHandler.deleteLyrics(inputText); 
     printDatabase(); 
    } 

    public void printDatabase(){ 
     String dbString = dbHandler.databaseToString(); 
     uText.setText(dbString); 
     uInput.setText(""); 
    } 
} 
+0

一般的にデータストレージやデータベースの普及率は高くなるでしょうが、Android用Realmのようなツールを検討したことがありますか? – Eenvincible

+0

@Engvincibleはそれを聞いたことがありませんでした。あなたにそれを調べていただきありがとうございます – LJAM

答えて

0

このように、あなたのコードにc.moveToNext();を追加してください:あなたはwhilemoveToNext()を呼び出さない場合

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

isAfterLast()は決してになることはありません。結果的に永続的なループとメモリ不足例外が発生します。

+0

助けていただきありがとうございますが、現在IMはmoveNextのメソッドを解決できません。 – LJAM

+0

@LJAM、申し訳ありません、それはmoveToNext()です。 –

関連する問題