2014-02-03 3 views
0

Im разрабатывает приложение для управления вашими дневными таблетками. Он состоит из списка таблеток (с указанием имени и часа), и вы можете добавить таблетку.База данных SQL на Android

Приложение запускается правильно, я могу перейти в макет добавления, но когда я нажимаю «Добавить», он останавливается. Я не знаю, почему это останавливается; Я думаю, что это связано с сохранением новой таблетки в database.

Я попытался добавить в качестве намерений дополнительные часы и имя (чтобы перейти от макета Add к макету Main) и попытаться сохранить их из основного класса (я думал, возможно, это не могло сохранить, потому что я пытался сделать это из класса добавления).

Вот основной вид деятельности:

package com.example.pilladvisor; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.ContentValues; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

private ListView listPastilles; 
private SQLiteDatabase db; 
private Pastilla[] datos; 
private TextView pastis; 

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

    Intent h = getIntent(); 
    Boolean afegit = h.getBooleanExtra("AFEGIT",false); 

    if (afegit) { 
     int hora = h.getIntExtra("HORA", 0); 
     String nom = h.getStringExtra("NOM"); 

     ContentValues nuevoRegistro = new ContentValues(); 
     nuevoRegistro.put("nom", nom); 
     nuevoRegistro.put("hora", hora); 
     db.insert("Pastilles", null, nuevoRegistro); 
    } 

    PastillesSQLiteHelper bdh = 
      new PastillesSQLiteHelper(this, "DBPastilles", null, 1); 

     db = bdh.getWritableDatabase(); 


    //startService (new Intent(this, ServeiHora.class));  

    Cursor c = db.rawQuery("SELECT nom, hora FROM Pastilles", null); 

    int i = 0; 

    if (c.moveToFirst()) { 
     //Recorremos el cursor hasta que no haya más registros 
     i = 0; 
     do { 
       String nom = c.getString(0); 
       int hora = c.getInt(1); 

       datos[i] = new Pastilla(nom,hora); 

       ++i; 
     } while(c.moveToNext()); 
    } 

    pastis = (TextView)findViewById(R.id.textView1); 

    if (i == 0){ 
     pastis.setText("No tens pastilles!"); 
    } 
    else { 
     pastis.setText("Hi ha " + i + " alarmes programades."); 

     AdaptadorPastilles adaptador = new AdaptadorPastilles(this); 

     listPastilles = (ListView)findViewById(R.id.listPastilles); 

     listPastilles.setAdapter(adaptador); 
    } 

    Button Boto1 = (Button)findViewById(R.id.button1); 
    Boto1.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(MainActivity.this, Afegir.class); 
      startActivity(intent); 
     } 
    }); 
} 

class AdaptadorPastilles extends ArrayAdapter<Pastilla> { 

    Activity context; 

    AdaptadorPastilles(Activity context) { 
     super(context, R.layout.listitem_pastilla, datos); 
     this.context = context; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View item = inflater.inflate(R.layout.listitem_pastilla, null); 

     TextView lblTitulo = (TextView)item.findViewById(R.id.LblTitulo); 
     lblTitulo.setText(datos[position].getTitulo()); 

     TextView lblSubtitulo =(TextView)item.findViewById(R.id.LblSubTitulo);    lblSubtitulo.setText(datos[position].getSubtitulo()); 

     return(item); 
    } 
    } 
} 

и здесь у вас есть Добавить активность:

package com.example.pilladvisor; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 

public class Afegir extends Activity{ 

private EditText field_nom; 
private EditText field_hora; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_afegir); 

    field_nom = (EditText)findViewById(R.id.editText1); 
    field_hora = (EditText)findViewById(R.id.editText2); 

    Button Boto1 = (Button)findViewById(R.id.button1); 
    Boto1.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(Afegir.this, MainActivity.class); 
      startActivity(intent); 
     } 
    }); 



    Button Boto2 = (Button)findViewById(R.id.button2); 
    Boto2.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String nom = field_nom.getText().toString(); 
      int hora =  Integer.parseInt(field_hora.getText().toString()); 

      Intent intent = new Intent(Afegir.this, MainActivity.class); 
      intent.putExtra("AFEGIT",true); 
      intent.putExtra("NOM", nom); 
      intent.putExtra("HORA", hora); 
      startActivity(intent); 
     } 
    }); 

} 

} 

наконец здесь класс базы данных:

package com.example.pilladvisor; 

import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 

public class PastillesSQLiteHelper extends SQLiteOpenHelper { 

String sqlCreate = "CREATE TABLE Pastilles (nom TEXT, hora INTEGER)"; 

public PastillesSQLiteHelper(Context contexto, String nom, CursorFactory factory, int version) { 
    super(contexto, nom, factory, version); 
} 

@Override 
public void onCreate(SQLiteDatabase db){ 
    db.execSQL(sqlCreate); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva){ 
    db.execSQL("DROP TABLE IF EXISTS Pastilles"); 

    db.execSQL(sqlCreate); 
} 


} 

Ошибка говорит:

02-03 15:23:33.492: E/AndroidRuntime(666): FATAL EXCEPTION: main 
02-03 15:23:33.492: E/AndroidRuntime(666): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.example.pilladvisor/com.example.pilladvisor.MainActivity}:  java.lang.NullPointerException 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2092) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2117) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.access$700(ActivityThread.java:134) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1218) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.os.Looper.loop(Looper.java:137) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.main(ActivityThread.java:4867) 
02-03 15:23:33.492: E/AndroidRuntime(666): at java.lang.reflect.Method.invokeNative(Native Method) 
02-03 15:23:33.492: E/AndroidRuntime(666): at java.lang.reflect.Method.invoke(Method.java:511) 
02-03 15:23:33.492: E/AndroidRuntime(666): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 
02-03 15:23:33.492: E/AndroidRuntime(666): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 
02-03 15:23:33.492: E/AndroidRuntime(666): at dalvik.system.NativeStart.main(Native Method) 
02-03 15:23:33.492: E/AndroidRuntime(666): Caused by: java.lang.NullPointerException 
02-03 15:23:33.492: E/AndroidRuntime(666): at com.example.pilladvisor.MainActivity.onCreate(MainActivity.java:40) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.Activity.performCreate(Activity.java:5047) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
02-03 15:23:33.492: E/AndroidRuntime(666): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2056) 
02-03 15:23:33.492: E/AndroidRuntime(666): ... 11 more 
+0

'Вызванный: java.lang.NullPointerException в com.example.pilladvisor.MainActivity.onCreate (MainActivity.java:40) '- что на линии 40? Что-то есть null, и этого не должно быть. – 323go

ответ

0

Вы не можете использовать элемент db перед его началом.

in line 40: db.insert("Pastilles", null, nuevoRegistro); db имеет значение null, поэтому он падает.

Переместить блок кода, которые начинаются с «if (afegit) {» под кодом Посвященные дб:

db = bdh.getWritableDatabase(); 
0

Вы не intlaize дб экземпляра. Это является причиной того, что вы аварии на нуль за исключением ponter в:

db.insert("Pastilles", null, nuevoRegistro); 
0

Когда вы звоните

db.insert("Pastilles", null, nuevoRegistro); 

дб равна нулю. Вы должны сделать

PastillesSQLiteHelper bdh = 
     new PastillesSQLiteHelper(this, "DBPastilles", null, 1); 

    db = bdh.getWritableDatabase(); 

до db.insert();

Надеюсь, это поможет.

0

Прежде чем задать вопрос, вы должны попытаться отладить свой код и прочитать журналы. Так же, как ваш журнал говорит в строке 15, есть java.lang.NullPointerException, что означает, что вы пытаетесь получить доступ к объекту, который еще не был инициализирован.

В логах в строке 16 есть намек, где брошено исключение:

at com.example.pilladvisor.MainActivity.onCreate(MainActivity.java:40) 

Это означает, что в вашем файле «MainActivity.java» в строке 40 генерируется исключение.

Итак, давайте посмотрим на данный момент код:

33: if (afegit) { 
34:  int hora = h.getIntExtra("HORA", 0); 
35:  String nom = h.getStringExtra("NOM"); 
36: 
37:  ContentValues nuevoRegistro = new ContentValues(); 
38:  nuevoRegistro.put("nom", nom); 
39:  nuevoRegistro.put("hora", hora); 
40:  db.insert("Pastilles", null, nuevoRegistro); 
41: } 
42: 
43: PastillesSQLiteHelper bdh = 
44:   new PastillesSQLiteHelper(this, "DBPastilles", null, 1); 
45: 
46:  db = bdh.getWritableDatabase(); 

В случае, когда Вы пытаетесь вызвать метод из «db'-объекта. Но инициализация еще не завершена. Это происходит в строке 46.

Решение должно заключаться в том, чтобы поставить код с строки 43 на 46 перед if-case.

33: PastillesSQLiteHelper bdh = 
34:  new PastillesSQLiteHelper(this, "DBPastilles", null, 1); 
35: 
36: db = bdh.getWritableDatabase(); 
37: 
38: if (afegit) { 
39:  int hora = h.getIntExtra("HORA", 0); 
40:  String nom = h.getStringExtra("NOM"); 
41: 
42:  ContentValues nuevoRegistro = new ContentValues(); 
43:  nuevoRegistro.put("nom", nom); 
44:  nuevoRegistro.put("hora", hora); 
45:  db.insert("Pastilles", null, nuevoRegistro); 
46: } 

Если вы используете Eclipse для разработки, это отличный учебник для отладки.

http://www.vogella.com/tutorials/EclipseDebugging/article.html

Она не основана на Android Разработка хотя это отличный учебник и должен помочь вам очень много. Additionaly вы должны посмотреть на официальном нить для Android отладки для разработки в Eclipse, с ADT - плагин

http://developer.android.com/tools/debugging/debugging-projects.html

Смежные вопросы