2016-07-28 9 views
0

これは愚かであると判明した場合は申し訳ありません。 3つのEditTextフィールド、タイトル、説明、ルーチンを持つ1つのアクティビティでユーザーからデータを取得しようとしていますが、これをSQLiteデータベースに入れて(そしてDBAdapterを使用します)、別のアクティビティリストに表示しますビュー。問題は、フィールドを入力してonClick_AddTask関数を呼び出す保存ボタンを押した後、リストビューアクティビティに戻ると、明らかなエラーはなく、リストビューが空であることです。私はlogcatでいくつかのエラーが発生しますが、私は本当にそれを理解することはできません。あらゆる種類の洞察力または建設的な批判はいつでも歓迎され、感謝しています。Android StudioのSQLiteデータベースから他のアクティビティへListView

DBAdapter:

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

public class DBAdapter { 

private static final String TAG = "DBAdapter"; //used for logging database version changes 

// Field Names: 
public static final String KEY_ROWID = "_id"; 
public static final String KEY_TASK = "task"; 
public static final String KEY_DESCRIPTION = "description"; 
public static final String KEY_DATE = "date"; 
public static final String KEY_EXERCISES = "exercises"; 

public static final String[] ALL_KEYS = new String[] {KEY_ROWID, KEY_TASK, KEY_DESCRIPTION, KEY_DATE, KEY_EXERCISES}; 

// Column Numbers for each Field Name: 
public static final int COL_ROWID = 0; 
public static final int COL_TASK = 1; 
public static final int COL_DATE = 2; 
public static final int COL_DESCRIPTION = 3; 
public static final int COL_EXERCISES = 4; 

// DataBase info: 
public static final String DATABASE_NAME = "dbToDo"; 
public static final String DATABASE_TABLE = "mainToDo"; 
public static final int DATABASE_VERSION = 3; // The version number must be incremented each time a change to DB structure occurs. 

//SQL statement to create database 
private static final String DATABASE_CREATE_SQL = 
     "CREATE TABLE " + DATABASE_TABLE 
     + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
     + KEY_TASK + " TEXT NOT NULL, " 
     + KEY_DATE + " TEXT, " 
     + KEY_DESCRIPTION + " TEXT, " 
     + KEY_EXERCISES + " TEXT" 
     + ");"; 

private final Context context; 
private DatabaseHelper myDBHelper; 
private SQLiteDatabase db; 


public DBAdapter(Context ctx) { 
    this.context = ctx; 
    myDBHelper = new DatabaseHelper(context); 
} 

// Open the database connection. 
public DBAdapter open() { 
    db = myDBHelper.getWritableDatabase(); 
    return this; 
} 

// Close the database connection. 
public void close() { 
    myDBHelper.close(); 
} 

// Add a new set of values to be inserted into the database. 
public long insertRow(String task, String date, String description, String exercises) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_TASK, task); 
    initialValues.put(KEY_DATE, date); 
    initialValues.put(KEY_DESCRIPTION, description); 
    initialValues.put(KEY_EXERCISES, exercises); 


    // Insert the data into the database. 
    return db.insert(DATABASE_TABLE, null, initialValues); 
} 

// Delete a row from the database, by rowId (primary key) 
public boolean deleteRow(long rowId) { 
    String where = KEY_ROWID + "=" + rowId; 
    return db.delete(DATABASE_TABLE, where, null) != 0; 
} 

public void deleteAll() { 
    Cursor c = getAllRows(); 
    long rowId = c.getColumnIndexOrThrow(KEY_ROWID); 
    if (c.moveToFirst()) { 
     do { 
      deleteRow(c.getLong((int) rowId));    
     } while (c.moveToNext()); 
    } 
    c.close(); 
} 

// Return all data in the database. 
public Cursor getAllRows() { 
    String where = null; 
    Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, where, null, null, null, null, null); 
    if (c != null) { 
     c.moveToFirst(); 
    } 
    return c; 
} 

// Get a specific row (by rowId) 
public Cursor getRow(long rowId) { 
    String where = KEY_ROWID + "=" + rowId; 
    Cursor c = db.query(true, DATABASE_TABLE, ALL_KEYS, 
        where, null, null, null, null, null); 
    if (c != null) { 
     c.moveToFirst(); 
    } 
    return c; 
} 

// Change an existing row to be equal to new data. 
public boolean updateRow(long rowId, String task, String date) { 
    String where = KEY_ROWID + "=" + rowId; 
    ContentValues newValues = new ContentValues(); 
    newValues.put(KEY_TASK, task); 
    newValues.put(KEY_DATE, date); 
    // Insert it into the database. 
    return db.update(DATABASE_TABLE, newValues, where, null) != 0; 
} 


private static class DatabaseHelper extends SQLiteOpenHelper 
{ 
    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase _db) { 
     _db.execSQL(DATABASE_CREATE_SQL);   
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading application's database from version " + oldVersion 
       + " to " + newVersion + ", which will destroy all old data!"); 

     // Destroy old database: 
     _db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 

     // Recreate new database: 
     onCreate(_db); 
    } 
} 

}

主な活動:

import android.content.Intent; 
import android.database.Cursor; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.ButtonBarLayout; 
import android.text.TextUtils; 
import android.text.format.Time; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.List; 

public class MainActivity extends AppCompatActivity { 

Time today = new Time(Time.getCurrentTimezone()); 
DBAdapter myDB; 
EditText title; 
Button newTask; 
EditText description; 
EditText routine; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    title = (EditText) findViewById(R.id.editTextTask); 
    description = (EditText) findViewById(R.id.editDescriptionTask); 
    routine = (EditText) findViewById(R.id.editRoutineTask); 
    newTask = (Button) findViewById(R.id.buttonNew); 

    newTask.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startActivity(new Intent(MainActivity.this, MenuActivity.class)); 
     } 
    }); 

    openDB(); 
    populateListView(); 
    listViewItemClick(); 
    listViewItemLongClick(); 

} 

private void openDB() { 
    myDB = new DBAdapter(this); 
    myDB.open(); 
} 

public void populateListView() { 
    Cursor cursor = myDB.getAllRows(); 

    String[] fromFieldNames = new String[] { 
      DBAdapter.KEY_ROWID,DBAdapter.KEY_TASK,DBAdapter.KEY_DESCRIPTION 
    }; 

    int[] toViewIDs = new int[] { 
      R.id.textViewItemNumber, R.id.textViewItemTask, R.id.textViewItemDescription 
    }; 

    SimpleCursorAdapter myCursorAdapter; 
    myCursorAdapter = new SimpleCursorAdapter(getBaseContext(),R.layout.item_layout,cursor,fromFieldNames,toViewIDs,0); 
    ListView myList = (ListView)findViewById(R.id.listViewTasks); 
    myList.setAdapter(myCursorAdapter); 
} 

private void updateTask(long id) { 
    Cursor cursor = myDB.getRow(id); 
    if(cursor.moveToFirst()) { 
     String task = title.getText().toString(); 
     today.setToNow(); 
     String date = today.format("%Y-%M-%D %H:%M:%S"); 
     myDB.updateRow(id, task, date); 
    } 

    cursor.close(); 
} 

private void listViewItemClick() { 
    ListView myList = (ListView) findViewById(R.id.listViewTasks); 
    myList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int arg2, long id) { 
      updateTask(id); 
      populateListView(); 
      displayToast(id); 
     } 
    }); 
} 

public void onClick_AddTask(View v) { 
    today.setToNow(); 
    String timeStamp = today.format("%Y-%M-%D %H:%M:%S"); 
    if(!TextUtils.isEmpty(title.getText().toString())) { 
     myDB.insertRow(title.getText().toString(), timeStamp, description.getText().toString(), routine.getText().toString()); 
    } 
    populateListView(); 
} 

public void onClick_DeleteTasks(View v) { 
    myDB.deleteAll(); 
    populateListView(); 
} 

private void listViewItemLongClick() { 
    ListView myList = (ListView) findViewById(R.id.listViewTasks); 
    myList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long id) { 
      myDB.deleteRow(id); 
      populateListView(); 

      return false; 
     } 
    }); 
} 

private void displayToast(long id) { 
    Cursor cursor = myDB.getRow(id); 
    if(cursor.moveToFirst()) { 
     long idDB = cursor.getLong(DBAdapter.COL_ROWID); 
     String task = cursor.getString(DBAdapter.COL_TASK); 
     String date = cursor.getString(DBAdapter.COL_DATE); 

     String message = "ID: " + idDB + "\n" + "Task: " + task + "\n" + "Date: " + date; 

     Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show(); 
    } 
    cursor.close(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    closeDB(); 
} 

private void closeDB() { 
    myDB.close(); 
} 

}

第アクティビティー:

import android.content.Intent; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

public class MenuActivity extends AppCompatActivity { 

Button save; 

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

    save = (Button) findViewById(R.id.buttonAddTask); 
    save.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      startActivity(new Intent(MenuActivity.this, MainActivity.class)); 
     } 
    }); 
} 

}

+0

あなたのlogcatは無関係です。これはシステムログだけです。 –

+0

質問にコードを入れて、リンクを避けてください。リンクが死ぬ/壊れた場合、この質問は誰にもほとんど役に立たない。 – petey

答えて

0

insertRowが返されます。 1より小さい値を返した場合は、挿入できません。

0

問題は、ListViewが空であることです。

)は(PopulateListViewで非常に密接に見て:

public void populateListView() { 
    Cursor cursor = myDB.getAllRows(); 

    String[] fromFieldNames = new String[] { 
      DBAdapter.KEY_ROWID,DBAdapter.KEY_TASK,DBAdapter.KEY_DESCRIPTION 
    }; 

    int[] toViewIDs = new int[] { 
      R.id.textViewItemNumber, R.id.textViewItemTask, R.id.textViewItemDescription 
    }; 

    SimpleCursorAdapter myCursorAdapter; 
    myCursorAdapter = new SimpleCursorAdapter(getBaseContext(),R.layout.item_layout,cursor,fromFieldNames,toViewIDs,0); 
    ListView myList = (ListView)findViewById(R.id.listViewTasks); 
    myList.setAdapter(myCursorAdapter); 
} 

いくつかの手がかりすべての

まず、あなたははmyListリストビュー、メソッドが呼び出されるたびに初期化しておきます。クラスがインスタンス化されると、その1回行います。どうして?空のリストビューなどを使ってリストを上書きしている可能性があるからです。私は言うことができませんが、それは手掛かりです。

第2に、新しいアイテムがListViewに追加される方法はわかりません。私はアダプターを毎回設定していますが、追加が表示されません。たぶんそれは私だけですが、見るべきことです。

さて、ここで私は)(OnCreateイベントでは、リストビュー

を更新していいくつかの簡単なコードです - (ワンタイム初期化)私が持っている:そして、

listView = (ListView) findViewById(R.id.mainListView); 
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listViewItems); 
listView.setAdapter(adapter); 

後に、他のコード内のどこで私は、次のようなコードを持っているアイテムを追加したい:

// Add three generic items 
    for (int x = 0;x <=2;x++){ 
      adapter.add("test : " + String.valueOf(x)); 
     } 
    // let the adapter/view know the item list has changed so UI is updated. 
    adapter.notifyDataSetChanged(); 

これが答えではないかもしれませんが、あなたがそこに得るのを助けることがあります。 幸運。

+1

あなたのお時間をありがとう、ありがとうございました、私はあなたが言及したすべてを試しましたが、私が言ったように、問題は愚かであることが判明しました。保存ボタンのXMLでは、魔法使いがメニューレイアウトにあるようですが、メインのJavaファイルでonClick_AddTask関数を呼び出そうとしました。私は今、別のレイアウトファイルからメインJavaファイルから関数にアクセスする方法を理解する必要がありますが、それは別の質問のためだと思います。 – Konrad

関連する問題