2016-07-28 13 views
0

Tut mir leid, wenn dies sich als dumm erweist. Ich versuche, einige Daten vom Benutzer in einer Tätigkeit zu erhalten, die 3 EditText Felder, Titel, Beschreibung und Routine hat, es in eine SQLite Datenbank setzen (und ja verwende ich ein DBAdapter) und es dann in einer anderen Tätigkeitsliste zeigen Aussicht. Das Problem ist, dass, nachdem ich die Felder ausfülle und die Schaltfläche "Speichern" drücke, die die onClick_AddTask-Funktion aufruft und dann zu der Aktivität der Listenansicht zurückkehrt, gibt es keinen offensichtlichen Fehler, aber die Listenansicht ist leer. Ich bekomme zwar ein paar Fehler im logcat, aber ich kann es nicht wirklich verstehen. Jede Art von Einsicht oder konstruktive Kritik ist immer willkommen und danke.Android Studio von SQLite Datenbank zu anderen Aktivitäten 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); 
    } 
} 

}

Hauptaktivität:

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(); 
} 

}

Zweite Aktivität:

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

Ihr Logcat ist irrelevant. Das sind nur Systemprotokolle. –

+0

Geben Sie den Code in die Frage ein, vermeiden Sie es, sie zu verknüpfen. Wenn die Links sterben/brechen, hilft diese Frage niemandem. – petey

Antwort

0

Überprüfen Sie, was insertRow zurückgibt. Wenn es weniger als 1 zurückgibt, bedeutet dies, dass Sie nicht einfügen können.

0

Ihr Problem ist, dass die ListView leer ist.

sehr genau anschauen 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); 
} 

Einige Clues

Zu allererst Sie die myList Listview immer initialisiert wird jedesmal, wenn die Methode aufgerufen. Tun Sie das einmal, wenn die Klasse instanziiert wird. Warum? Weil Sie die Liste möglicherweise mit einer leeren Listenansicht oder etwas anderem überschreiben. Ich kann es nicht sagen, aber es ist ein Hinweis.

Zweitens sehe ich nicht, wie neue Elemente zu Ihrem ListView hinzugefügt werden. Ich sehe, dass Sie jedes Mal den Adapter einstellen, aber ich sehe keinen Zusatz. Vielleicht bin ich es nur, aber es ist etwas zum Anschauen.

, Jetzt ist hier ein paar schnelle Code, den ich habe, dass ein Listview aktualisiert

In OnCreate() - (einmalige Initialisierung) Ich habe:

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

dann später in einen anderen Code, wo ich ich habe Code wie den folgenden wollen Artikel hinzufügen:

// 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(); 

Dies ist nicht die Antwort sein, aber kann man dort helfen. Viel Glück.

+1

Vielen Dank für Ihre Zeit, ich habe alles versucht, was Sie erwähnt haben, aber wie gesagt, das Problem stellte sich als dumm heraus. Es scheint, dass ich in der XML auf der Speichern-Schaltfläche, die im Menü-Layout ist, versuchte, die onClick_AddTask-Funktion in der Haupt-Java-Datei aufzurufen.Ich muss jetzt herausfinden, wie man eine Funktion von der Hauptjava-Datei von einer anderen Plandatei erreicht, aber ich denke, dass das für eine andere Frage ist. – Konrad