2016-04-05 1 views
-2

мое приложение рушится, когда я пытаюсь начать работу, где у меня есть список. Я пытаюсь получить данные sqlite в списке. Отчет об ошибке:Почему мое приложение падает при попытке заполнить список из базы данных sqlite?

04-05 14:11:47.479 2781-2781/? E/AndroidRuntime: FATAL EXCEPTION: main 
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jonnyg.gardenapp/com.jonnyg.gardenapp.SeedSave}: java.lang.NullPointerException 
               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
               at android.app.ActivityThread.access$600(ActivityThread.java:141) 
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
               at android.os.Handler.dispatchMessage(Handler.java:99) 
               at android.os.Looper.loop(Looper.java:137) 
               at android.app.ActivityThread.main(ActivityThread.java:5041) 
               at java.lang.reflect.Method.invokeNative(Native Method) 
               at java.lang.reflect.Method.invoke(Method.java:511) 
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
               at dalvik.system.NativeStart.main(Native Method) 
               Caused by: java.lang.NullPointerException 
               at com.jonnyg.gardenapp.SeedSave.populateListView(SeedSave.java:197) 
               at com.jonnyg.gardenapp.SeedSave.onCreate(SeedSave.java:85) 
               at android.app.Activity.performCreate(Activity.java:5104) 
               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)  
               at android.app.ActivityThread.access$600(ActivityThread.java:141)  
               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)  
               at android.os.Handler.dispatchMessage(Handler.java:99)  
               at android.os.Looper.loop(Looper.java:137)  
               at android.app.ActivityThread.main(ActivityThread.java:5041)  
               at java.lang.reflect.Method.invokeNative(Native Method)  
               at java.lang.reflect.Method.invoke(Method.java:511)  
               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)  
               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)  
               at dalvik.system.NativeStart.main(Native Method)  

DataBaseHelperClass код Релевент:

public class DataBaseHelper extends SQLiteOpenHelper { 
private static final String DataBASE_NAME = "SeedSave.db"; 

private static final String TABLE_NAME = "seed_table"; 
//public static final String COL_1 = "ID"; 
private static final String COL_2 = "SNAME"; 
private static final String COL_3 = "STYPE"; 
private static final String COL_4 = "SAMOUNT"; 



private static final int Version = 1; 
private static Context myContext; 



/*String name, SQLiteDatabase.CursorFactory factory, int version*/ 
public DataBaseHelper(Context context) { 
    super(context, DataBASE_NAME, null, Version); 
    //SQLiteDatabase db = this.getWritableDatabase(); 
    myContext = context; 
} 

создания таблицы самой

@Override 
public void onCreate(SQLiteDatabase db) { 

    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, SNAME TEXT, STYPE TEXT,SAMOUNT INTEGER)"); 



} 

в том же хелперов базы данных класса я получить запрос

public Cursor getAllData(){ 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select ID AS _id,SNAME,STYPE,SAMOUNT from " + TABLE_NAME,null); 
    /*if(res!=null){ 
     res.moveToFirst(); 
    }*/ 
    return res; 
} 

изменение SQLiteDatabase db = this.getWritableDatabase(); SQLiteDatabase db = this.getReadableDatabase(); не имело заметных эффектов.

сейчас в моей деятельности я хочу запустить просмотр списка, я вызываю этот метод внутри него.

private void populateListView(){ 
    ListView myList_view; 
    myDb = new DataBaseHelper(this); 
    Cursor res = myDb.getAllData(); 

    SeedSave mySeed = new SeedSave(); 
    String[] from = new String[]{null,mySeed.editSname.toString(), 
      mySeed.editStype.toString(),mySeed.editSamount.toString()}; 

    int[] to = new int[]{R.id.textViewID,R.id.textViewName,R.id.textViewSType,R.id.textViewAmount 
      }; 
    SimpleCursorAdapter myScursorAdapter; 
    myScursorAdapter = new SimpleCursorAdapter(getBaseContext(), 
      R.layout.item_layout_seed, res, from,to,0); 

    myList_view = (ListView)findViewById(R.id.listViewTest); 
    myList_view.setAdapter(myScursorAdapter); 
} 

Я думаю, что probem лежит пользовательского макета, или С и переменных не выстраиваются в очередь, данные, необходимые правильно.

сейчас для моей таблицы семян, в которой я передаю значения конструктору для добавления данных.

public class Seed_Table { 

private int _id; 
private String _seedName; 
private String _seedType; 
//private String _amount; 
private int _amount; 

public Seed_Table(){ 

} 
public Seed_Table(String sname, String stype, int amount) { 
    this._seedName = sname; 
    this._seedType = stype; 
    this._amount = amount; 
} 



public void set_id(int _id) { 
    this._id = _id; 
} 

public void set_seedName(String _seedName) { 
    this._seedName = _seedName; 
} 

public void set_seedType(String _seedType) { 
    this._seedType = _seedType; 
} 

public void set_amount(int _amount) { 
    this._amount = _amount; 
} 

public int get_id() { 

    return _id; 
} 

public String get_seedName() { 
    return _seedName; 
} 

public int get_amount() { 
    return _amount; 
} 

public String get_seedType() { 
    return _seedType; 
} 

}

Следующая что мой заказ линейная планировка:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/textViewID" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/textViewName" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/textViewSType" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/textViewAmount" 
    android:layout_marginBottom="30dp"/> 

/>

есть проблема с созданием представления данных linerly? когда ориентация = вертикальная. должно ли оно быть горизонтальным ?. как я хочу, чтобы данные были посмотреть ниже: UI of layout

представление находится на активности я хочу use.below код для самого ListView:

<ListView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dp" 
    android:id="@+id/listViewTest" 

    android:layout_below="@+id/btnAdd" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

Im я также добавление, как я добавьте данные в базу данных в случае, если это может помочь. в классе dataBaseHelper я передать значения в конструктор Seed_Table:

public void addSeed(Seed_Table seed){ 
    ContentValues values = new ContentValues(); 
    values.put(COL_2, seed.get_seedName()); 
    values.put(COL_3, seed.get_seedType()); 
    values.put(COL_4, seed.get_amount()); 
    SQLiteDatabase db = getWritableDatabase(); 
    long rowInserted = db.insert(TABLE_NAME, null, values); 
    if(rowInserted != -1) { 
     insertToast(); 
    } 
    else{ 
     noInsertToast(); 
    } 
    db.close(); 
} 

Приведенный ниже метод вызывается в методе OnCreate предполагаемой активности.

public void AddData(){ 
    btnAddData.setOnClickListener(
      new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        try { 
         int quantity = Integer.parseInt(editSamount.getText().toString()); 

         Seed_Table seed = new Seed_Table(
           editSname.getText().toString(), 
           editStype.getText().toString(), 
           //editSamount.getText().toString() 
           quantity 
         ); 
         myDb.addSeed(seed); 
         if(editSname.getText().length() != 0 && 
           editStype.getText().length() != 0 && 
           editSamount.getText().length() != 0){ 

            editSname.getText().clear(); 
            editStype.getText().clear(); 
            editSamount.getText().clear(); 
         } 
         //Toast.makeText(SeedSave.this, "Data Inserted", Toast.LENGTH_LONG).show(); 
        } 
        catch (Exception e){ 
         e.printStackTrace(); 
         //Toast.makeText(SeedSave.this, "Data not Inserted", Toast.LENGTH_LONG).show(); 
        } 
       } 
      } 
    ); 
} 

В настоящее время я просматриваю данные через alertDialog.builder и строковый конструктор. Который я хочу изменить в виде списка, потому что он может выглядеть abit tider и может фактически нажимать на отдельные строки для выполнения действия. Ниже показано, как я просматриваю данные, если это помогает: в активности, которую я хочу использовать, я вызываю этот метод в onCreate.

public void veiwAll(){ 
    btnViewAll.setOnClickListener(
      new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //res holds the data from the database 
        Cursor res = myDb.getAllData(); 

        if(res.getCount() == 0){ 
         // show message 
         showMessage("Error", "No Data in Database"); 
         return; 
        } 

        StringBuffer myBuff = new StringBuffer(); 
        while (res.moveToNext()){ 
         myBuff.append("Id :"+ res.getString(0)+"\n"); 
         myBuff.append("Name :"+ res.getString(1)+"\n"); 
         myBuff.append("Type :"+ res.getString(2)+"\n"); 
         myBuff.append("Amount :"+ res.getString(3)+"\n\n"); 
        } 
        // show data 
        showMessage("Data",myBuff.toString()); 
       } 
      } 
    ); 
} 

также смотрите:

public void showMessage(String title,String message){ 
    AlertDialog.Builder myBuilder = new AlertDialog.Builder(this); 
    myBuilder.setCancelable(true); 
    myBuilder.setTitle(title); 
    myBuilder.setMessage(message); 
    myBuilder.show(); 
} 

, который заканчивает тем, как This here

, который все отношение я верю, чтобы получить представление о том, как я создания таблицы добавить данные и извлечения данных. надеюсь, это поможет найти, где проблема.

+2

Пожалуйста, ваши код как текст –

+0

вы можете оставить вам LogCat? – Sanoop

+1

Пожалуйста, разместите свой журнал сбоев –

ответ

0

Вы должны написать строку ниже в getAllData() вместо
SqliteDatabase db =this.getWrirtableDatabase() обусловлены здесь вам необходимо прочитать данные из базы данных: -

SqliteDatabase db=this.getReadableDatabase(); 

Вы также можете пройти по этой ссылке для получения правильного знания SQLite

Android sqlite tutorial

0

Ваш результирующий набор должен содержать '_id', это '_id', внутренне используемое адаптером курсора. Курсор адаптер doent найти «_id», вот почему ваше приложение врезаться

Изменить ваш запрос к

select ID AS _id,SNAME,STYPE FROM TABLE_NAME 
Смежные вопросы