Исключение нулевого указателя при получении данных из Sqlite - PullRequest
0 голосов
/ 12 января 2012

Я получаю данные из sqlite в базовый адаптер с помощью курсора.

main.java

SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c=db.rawQuery("select * from budget",null);
      while (c.moveToNext()) {



        String tes0 = Integer.toString(c.getInt(c.getColumnIndex("_id")));
        String tes1 = Double.toString(c.getDouble(c.getColumnIndex("material_actual")));
        tes2 = c.getString(c.getColumnIndex("start_date"));
        tes3 = c.getString(c.getColumnIndex("end_date"));

        String[] v0 = new String[] { tes0 };
        String[] v01 = new String[] { tes1 };
        String[] v02 = new String[] { tes2 };
        String[] v03 = new String[] { tes3 };

            Adapter_ListView adapter = new Adapter_ListView(getBaseContext(),
                v01, v02 , v03, theTotal); //string[]
            TaskList.setAdapter(adapter);

}

Затем Adapter_listView.java

public class Adapter_ListView extends BaseAdapter {
private int count;
private Context context;

private String[] string1;
private String[] string2;
private String[] string3;

private String con1;
private String con2;
private String con3;


public Adapter_ListView(Context baseContext, String[] v01, String[] v02, String[] v03, int theTotal) {
       this.count   = theTotal;
       this.context = baseContext;
       this.string1 = v01;
       this.string2 = v02;
       this.string3 = v03;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return count;
}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View contentView, ViewGroup arg2) {
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    contentView = inflater.inflate(R.layout.layout_inflate_list2, null);

    TextView title = (TextView)contentView.findViewById(R.id.inflate_title);
    TextView body = (TextView)contentView.findViewById(R.id.inflate_body);
    TextView sub = (TextView)contentView.findViewById(R.id.inflate_sub);


    title.setText(string1[position]);
    body.setText(string2[position]);
    sub.setText(string3[position]);


    return contentView;
}
}

из этого кода всегда ошибка -> ArrayOuOfBound, если выполнить этот код

title.setText(string1[position]);

как я могу это решить?

Ответы [ 4 ]

2 голосов
/ 12 января 2012

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

final DatabaseHelper m = new DatabaseHelper(this);
 m.open();

В вашем onDestroy или паузе.Позвоните

m.close();

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

РЕДАКТИРОВАТЬ:

Вваш DatabaseHelper класс.Создайте метод.

public void open(){
db.open();
}

public void close(){
db.close()
}

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

1 голос
/ 12 января 2012

Чтобы извлечь данные из курсора, сначала вы должны перейти к первым данным строки в курсоре.

Пример кода:

SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c=db.rawQuery("select * from budget",null);
if (c!=null) c.moveToFirst();
      while (c.moveToNext()) {
...
}

удачи !!: D

0 голосов
/ 12 января 2012

Попробуйте это:

main.java

SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c=db.rawQuery("select * from budget",null);
if(c.getCount()>0)
{
    int i=0; 
    int clength=c.getCount();
    String[] v0=new String[clength];
    String[] v1=new String[clength];
    String[] v2=new String[clength];
    String[] v3=new String[clength];

    while (c.moveToNext()) 
    {        
        String tes0 = Integer.toString(c.getInt(c.getColumnIndex("_id")));
        String tes1 = Double.toString(c.getDouble(c.getColumnIndex("material_actual")));
        tes2 = c.getString(c.getColumnIndex("start_date"));
        tes3 = c.getString(c.getColumnIndex("end_date"));

        v0[i]=tes0;
        v01[i]=tes1;
        v01[i]=tes2;
        v01[i]=tes3;
        i++;    
    }
    Adapter_ListView adapter = new Adapter_ListView(getBaseContext(),v01, v02 , v03, theTotal); //string[]
    TaskList.setAdapter(adapter);
}
0 голосов
/ 12 января 2012

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

SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor c=db.rawQuery("select * from budget",null);
int theTotal=c.getCount();
 String[] v0 = new String[theTotal];
        String[] v01 = new String[theTotal];
        String[] v02 = new String[theTotal];
        String[] v03 = new String[theTotal];

      int i=0;
      if (c!=null) c.moveToFirst();
      while (c.moveToNext()) {



        String tes0 = Integer.toString(c.getInt(c.getColumnIndex("_id")));
        String tes1 = Double.toString(c.getDouble(c.getColumnIndex("material_actual")));
        tes2 = c.getString(c.getColumnIndex("start_date"));
        tes3 = c.getString(c.getColumnIndex("end_date"));

        v0[i] =tes0 ;
        v01[i] = tes1 ;
        v02[i] = tes2 ;
        v03[i] = tes3 ;



}

Adapter_ListView adapter = new Adapter_ListView(getBaseContext(),
                v01, v02 , v03, theTotal); //string[]
            TaskList.setAdapter(adapter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...