Problema de base de datos SQLite en TextView

He estado trabajando en una aplicación en la que la Activity principal lleva a CalendarActivity , que tiene un botón que lleva a otra Activity donde el usuario crea un evento. Una vez que se crea el evento, el usuario se devuelve a CalendarActivity y TextView previamente vacío muestra el evento. El código que he utilizado parece que debería funcionar, y está cerca de un tutorial en línea. Investigué los comentarios del blog del video y del video maker, y muchos otros parecen decir que funciona bien. He comprobado una y otra vez, y creo que su gramaticalmente correcto, etc, pero no puedo conseguir que cargue el evento en el TextView . Cualquier puntero incluso ayudaría. Le pediría que lo mantuviera cerca del inglés básico, sólo estoy entrando en la programación y estoy usando esta aplicación como una experiencia de aprendizaje.

¡Gracias!

CalendarActivity :

 package com.bm.sn.sbeta; import android.content.Intent; import android.database.Cursor; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CalendarView; import android.widget.TextView; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; public class CalendarActivity extends AppCompatActivity { CalendarView calendar; Button createEvent; public static String createEventDate; DatabaseHelper db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_calendar); Cursor result = db.getAllData(); if (result.getCount() == 0) { noEventToday(); }else{ TextView eventList = (TextView)findViewById(R.id.eventList); StringBuffer stringBuffer = new StringBuffer(); while (result.moveToNext()) { stringBuffer.append("eventDat : "+result.getString(0)+"\n"); stringBuffer.append("timeHour : "+result.getString(1)+"\n"); stringBuffer.append("timeMinue : "+result.getString(2)+"\n"); stringBuffer.append("event : "+result.getString(3)+"\n"); stringBuffer.append("location : "+result.getString(4)+"\n"); stringBuffer.append("crew : "+result.getString(5)+"\n\n"); eventList.setText(stringBuffer); } } calendar = (CalendarView)findViewById(R.id.calendar); calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener(){ @Override public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth){ createEventDate = (month+"."+dayOfMonth+"."+year); createEvent.setText("Create Event for "+createEventDate); } }); createEvent = (Button)findViewById(R.id.eventCreateButton); createEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent toEventCreateActivity = new Intent(CalendarActivity.this, EventCreateActivity.class); startActivity(toEventCreateActivity); } }); } /*public void fillEventList (){ } public void noEventToday(){ TextView eventList = (TextView)findViewById(R.id.eventList); eventList.setText("Nothing scheduled for today."); }*/ } 

EventCreateActivity :

 package com.bm.sn.sbeta; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; public class EventCreateActivity extends AppCompatActivity { DatabaseHelper db; String textViewText = CalendarActivity.createEventDate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_event_create); db = new DatabaseHelper(this); final TextView titleTextView = (TextView)findViewById(R.id.titleTextView); titleTextView.setText("Create event for "+textViewText); final TimePicker timePicker = (TimePicker)findViewById(R.id.timePicker); final EditText entryEvent = (EditText)findViewById(R.id.entryEvent); final EditText entryLocation = (EditText)findViewById(R.id.entryLocation); final EditText entryCrew = (EditText)findViewById(R.id.entryCrew); Button createEventButton = (Button)findViewById(R.id.saveEvent); createEventButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { db.insertData( titleTextView.toString(), timePicker.getCurrentHour().toString(), timePicker.getCurrentMinute().toString(), entryEvent.getText().toString(), entryLocation.getText().toString(), entryCrew.getText().toString() ); Toast.makeText(EventCreateActivity.this, "I'll keep that in mind.", Toast.LENGTH_LONG).show(); Intent toCalendarActivity = new Intent(EventCreateActivity.this, CalendarActivity.class); startActivity(toCalendarActivity); } }); } } 

DatabaseHelper :

 package com.bm.sn.sbeta; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper{ public static final String DATABASE_NAME = "SavitaCalendar.db"; public static final String TABLE_NAME = "CalendarEvents"; public static final String col_0 = "ID"; public static final String col_1 = "eventDate" ; public static final String col_2 = "timeHour"; public static final String col_3 = "timeMinute"; public static final String col_4 = "event"; public static final String col_5 = "location"; public static final String col_6 = "crew"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table "+TABLE_NAME+ " (ID INTEGER PRIMARY KEY AUTOINCREMENT,EVENTDATE TEXT,TIMEHOUR TEXT,TIMEMINUTE TEXT, EVENT TEXT, LOCATION TEXT, CREW TEXT); "); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME); onCreate(db); } public void insertData (String eventDate, String timeHour, String timeMinute, String event, String location, String crew){ SQLiteDatabase db = this.getWritableDatabase(); ContentValues contentValues = new ContentValues(); contentValues.put(col_1, eventDate); contentValues.put(col_2, timeHour); contentValues.put(col_3, timeMinute); contentValues.put(col_4, event); contentValues.put(col_5, location); contentValues.put(col_6, crew); db.insert(TABLE_NAME, null, contentValues); db.close(); } public Cursor getAllData(){ SQLiteDatabase db = this.getWritableDatabase(); Cursor result = db.rawQuery("select * from "+TABLE_NAME, null); return result; } } 

Estás leyendo tus datos desde el DB en onCreate() .

onCreate() se llama cuando la Activity es (re) creada. No está garantizado que se llamará cuando navegue de EventCreateActivity .

Echa un vistazo a los documentos sobre el ciclo de vida de la Activity .

Como @ nuccio lo señaló, también parece que se olvidó de inicializar su instancia DatabaseHelper .

Debe usar un patrón singleton, algo como esto:

 private static DatabaseHelper instance; private DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, 1); } public static DatabaseHelper getInstance(Context context) { if (instance == null) { instance = new DatabaseHelper(context.getApplicationContext()); } return instance; } 

Puede iniciar EventCreateActivity utilizando startActivityForResult() y reemplazar onActivityResult() en CalendarActivity para actualizar su TextView .

Por ejemplo:

 public class CalendarActivity extends AppCompatActivity { private static final int REQUEST_CREATE_EVENT = 0; CalendarView calendar; Button createEvent; public static String createEventDate; TextView eventList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_calendar); eventList = (TextView) findViewById(R.id.eventList); getEvents(); calendar = (CalendarView) findViewById(R.id.calendar); calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() { @Override public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) { createEventDate = (month + "." + dayOfMonth + "." + year); createEvent.setText("Create Event for " + createEventDate); } }); createEvent = (Button) findViewById(R.id.eventCreateButton); createEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent toEventCreateActivity = new Intent(CalendarActivity.this, EventCreateActivity.class); startActivityForResult(toEventCreateActivity, REQUEST_CREATE_EVENT); } }); } private void getEvents() { // getting our DatabaseHelper instance DatabaseHelper db = DatabaseHelper.getInstance(this); Cursor result = db.getAllData(); if (result.getCount() == 0) { noEventToday(); } else { StringBuffer stringBuffer = new StringBuffer(); while (result.moveToNext()) { stringBuffer.append("eventDat : " + result.getString(0) + "\n"); stringBuffer.append("timeHour : " + result.getString(1) + "\n"); stringBuffer.append("timeMinue : " + result.getString(2) + "\n"); stringBuffer.append("event : " + result.getString(3) + "\n"); stringBuffer.append("location : " + result.getString(4) + "\n"); stringBuffer.append("crew : " + result.getString(5) + "\n\n"); eventList.setText(stringBuffer); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == RESULT_OK && requestCode == REQUEST_CREATE_EVENT) { getEvents(); } } public void noEventToday(){ TextView eventList = (TextView)findViewById(R.id.eventList); eventList.setText("Nothing scheduled for today."); } } 

Y en EventCreateActivity :

 createEventButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { db.insertData( titleTextView.toString(), timePicker.getCurrentHour().toString(), timePicker.getCurrentMinute().toString(), entryEvent.getText().toString(), entryLocation.getText().toString(), entryCrew.getText().toString() ); Toast.makeText(EventCreateActivity.this, "I'll keep that in mind.", Toast.LENGTH_LONG).show(); setResult(RESULT_OK); finish(); } }); 

Un enfoque aún mejor sería pasar los datos de su nuevo evento en el Intent , por lo que no tiene que leer el DB al volver a CalendarActivity .

O al menos devolver la nueva ID de fila, por lo que solo se necesita consultar un registro.

No ha instanciado su db correctamente en CalendarActivity.

Agrega esto

Db = nuevo DatabaseHelper (this);

Aquí es donde añadir esto a la clase:

  package com.mac.training.calendaractivitysqlhelperthing; imports ... public class CalendarActivity extends AppCompatActivity { CalendarView calendar; Button createEvent; public static String createEventDate; DatabaseHelper db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_calendar); //ADD this line here db = new DatabaseHelper(this); Cursor result = db.getAllData(); if (result.getCount() == 0) { //noEventToday(); }else{ //etc 

Eso solo debería funcionar, pero si no. También actualice su Manifiesto también con esto:

Actividad android: nombre = ". EventCreateActivity"

  <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mac.training.calendaractivitysqlhelperthing"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".CalendarActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".EventCreateActivity" /> </application> </manifest> 
  • SQLiteOpenHelper no puede llamar a onCreate?
  • Sqlite browser: ¿dónde está el archivo db?
  • Insertar y seleccionar datos en árabe Android SQLite
  • Copia de seguridad de Android y restauración de la base de datos desde y hacia la tarjeta SD
  • Se eliminó la base de datos de Sqlite cuando borro datos de la aplicación
  • Número máximo de filas en una tabla sqlite?
  • Recuperar un nombre de usuario y una contraseña en SQLITE DB por EMAIL_ADDRESS en ANDROID
  • Encriptación y bloqueo de bases de datos Android
  • La aplicación se bloquea si el cursor SQLite no tiene resultados
  • Base de datos local Unity SQLite
  • Android.database.sqlite.SQLiteException: la tabla X no tiene columna llamada Y:, mientras compila: INSERT INTO
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.