【问题标题】:java.lang.NullPointerException from SQLite class while accessing database in android在android中访问数据库时来自SQLite类的java.lang.NullPointerException
【发布时间】:2013-05-22 12:26:05
【问题描述】:

我是 Android 新手。我正在尝试通过 getDataMain() 方法从数据库中获取数据。当我运行我的应用程序时,它会给出 java.lang.NullPointerException。我找不到问题出在哪里?你能帮帮我吗?

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainFragment extends Fragment {

TextView bakici;
TextView arabaKredisi;
TextView ogrenimKredisi;
TextView tatilKredisi;
TextView elektrik;
TextView su;
TextView internet;
TextView aidat;
TextView kasko;
TextView digerTaksitler;
TextView diger;
TextView maasSelo;
TextView maasHilal;
TextView digerGelirler;
TextView toplamGelir;
TextView toplamHarcama;
TextView eldeKalan;

private final String TAG =  this.getClass().getSimpleName();
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    Log.i(TAG, "mainFragmentonCreate");

}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.maingetirgoster,
            container, false);
    toplamGelir = (TextView) view.findViewById(R.id.textToplamGelir2);
    digerGelirler = (TextView) view.findViewById(R.id.textDigerGelirler2);
    toplamHarcama = (TextView) view.findViewById(R.id.textToplamHarcama2);
    diger = (TextView) view.findViewById(R.id.textDiger2);
    digerTaksitler = (TextView) view.findViewById(R.id.textDigerTaksitler2);
    kasko = (TextView) view.findViewById(R.id.textKaskoSigorta2);
    aidat = (TextView) view.findViewById(R.id.textAidat2);
    internet = (TextView) view.findViewById(R.id.textFaturaInternet2);
    su = (TextView) view.findViewById(R.id.textFaturaSu2);
    elektrik = (TextView) view.findViewById(R.id.textFaturaElektrik2);
    tatilKredisi = (TextView) view.findViewById(R.id.textTatilKredisi2);
    ogrenimKredisi = (TextView)view.findViewById(R.id.textOgrenimKredisi2);
    arabaKredisi = (TextView) view.findViewById(R.id.textKrediAraba2);
    bakici = (TextView) view.findViewById(R.id.textButtonBakici2);
    eldeKalan = (TextView) view.findViewById(R.id.textEldeKalan2);
    maasSelo = (TextView) view.findViewById(R.id.textMaasSelo2);
    maasHilal = (TextView) view.findViewById(R.id.textMaasHilal2);

    Context context=getActivity();

    TemporaryDatabase tdb= new TemporaryDatabase(context);
    tdb.open();
    String[] result2= new String[2];
    result2=tdb.getData();
    tdb.close();

    AySonuDatabase adb=new AySonuDatabase(context);
    adb.open();
    String result[]= new String[25];

**line:49** result = adb.getDataMain(Integer.getInteger(result2[0]), result2[1]);
    adb.close();
    bakici.setText(result[2]);
    arabaKredisi.setText(result[3]);
    ogrenimKredisi.setText(result[4]);
    tatilKredisi.setText(result[5]);
    elektrik.setText(result[6]);
    su.setText(result[7]);
    internet.setText(result[8]);
    aidat.setText(result[9]);
    kasko.setText(result[10]);
    digerTaksitler.setText(result[11]);
    diger.setText(result[12]);
    maasSelo.setText(result[13]);
    maasHilal.setText(result[14]);
    digerGelirler.setText(result[15]);
    toplamHarcama.setText(result[16]);
    toplamGelir.setText(result[17]);
    eldeKalan.setText(result[18]);

    Log.i(TAG, "mainFragmentonCreateView");
    return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
}

}

这里是数据库类:

public class AySonuDatabase {

public static final String TAG = DatabaseHelper.class.getSimpleName();
public static final String DB_NAME = "butcedb.sql";
private static String DB_PATH ="/data/data/com.bilge.aysonu/assets/";
public static final int DB_VERSION = 1;
public static final String DB_TABLE = "harcamalar";

public static final String C_ID = "c_id";// Special for id
public static final String C_YIL = "spinnerYillar";
public static final String C_AY = "spinnerAylar";
public static final String C_BAKICI = "editTextBakici";
public static final String C_KREDIARABA = "editTextKrediAraba";
public static final String C_KREDIOGRENIM = "editTextKrediOgrenim";
public static final String C_KREDITATIL = "editTextKrediTatil";
public static final String C_FATURAELEKTRIK = "editTextFaturaElektrik";
public static final String C_FATURASU = "editTextFaturaSu";
public static final String C_FATURAINTERNET = "editTextFaturaInternet";
public static final String C_AIDAT = "editTextAidat";
public static final String C_KASKOSIGORTA = "editTextKaskoSigorta";

public static final String C_DIGERTAKSITLER = "editTextDigerTaksitler";
public static final String C_DIGER = "editTextDiger";
public static final String C_MAASSELO = "editTextMaasSelo";
public static final String C_MAASHILAL = "editTextMaasHilal";
public static final String C_DIGERGELIRLER = "editTextDigerGelirler";
public static final String C_TOPLAMHARCAMA = "editTextToplamHarcama";
public static final String C_TOPLAMGELIR = "editTextToplamGelir";
public static final String C_ELDEKALAN = "editTextEldeKalan";

public static final String CREATE_TABLE="CREATE TABLE harcamalar (c_id integer primary key autoincrement," +
        "spinnerYillar integer,spinnerAylar TEXT,editTextBakici integer,editTextKrediAraba integer,editTextKrediOgrenim integer,editTextKrediTatil integer," +
        "editTextFaturaElektrik integer,editTextFaturaSu integer,editTextFaturaInternet integer,editTextAidat integer,editTextKaskoSigorta integer," +
        "editTextDigerTaksitler integer,editTextDiger integer,editTextMaasSelo integer,editTextMaasHilal integer,editTextDigerGelirler integer," +
        "editTextToplamHarcama integer,editTextToplamGelir integer, editTextEldeKalan integer);";

private DatabaseHelper dbHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;


public static class DatabaseHelper extends SQLiteOpenHelper {


    public DatabaseHelper(Context context) {

        super(context, DB_NAME, null, DB_VERSION);


    }

    @Override
    public void onCreate(SQLiteDatabase db) {

            Log.d(TAG, "onCreate sql: " + CREATE_TABLE);
            db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("drop table if exists " + DB_TABLE);
        Log.w(TAG, "onUpdate drop table " + DB_TABLE);
        onCreate(db);
    }

}
public AySonuDatabase(Context c) {
    ourContext = c;

}
public void openDatabase() throws SQLException {
    ourDatabase = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null,
            SQLiteDatabase.OPEN_READWRITE);
}

public  void open() throws NumberFormatException {

    try{
        dbHelper = new DatabaseHelper(ourContext);
        ourDatabase = dbHelper.getWritableDatabase();
        return ;
    }  catch (Exception e) {
        Log.d(TAG,"Couldn't open database "+DB_NAME);
        e.printStackTrace();
    }
}

public void close() {

    dbHelper.close();
    ourDatabase.close();
}
public void Entry(int yilsql, String aysql, int bakicisql,
        int krediArabasql, int krediOgrenimsql, int krediTatilsql,
        int faturaElektriksql, int faturaSusql, int faturaInternetsql,
        int aidatsql, int kaskoSigortasql, int digerTaksitlersql, 
        int digersql, int maasSelosql,int maasHilalsql,int digerGelirlersql,
        int toplamHarcamasql,int toplamGelirsql,int eldeKalansql ) {

    ContentValues cv = new ContentValues();
    cv.put(C_YIL, yilsql);
    cv.put(C_AY, aysql);
    cv.put(C_BAKICI, bakicisql);
    cv.put(C_KREDIARABA, krediArabasql);
    cv.put(C_KREDIOGRENIM, krediOgrenimsql);
    cv.put(C_KREDITATIL, krediTatilsql);
    cv.put(C_FATURAELEKTRIK, faturaElektriksql);
    cv.put(C_FATURASU, faturaSusql);
    cv.put(C_FATURAINTERNET, faturaInternetsql);
    cv.put(C_AIDAT, aidatsql);
    cv.put(C_KASKOSIGORTA, kaskoSigortasql);
    cv.put(C_DIGERTAKSITLER, digerTaksitlersql);
    cv.put(C_DIGER, digersql);
    cv.put(C_MAASSELO,maasSelosql);
    cv.put(C_MAASHILAL, maasHilalsql);
    cv.put(C_DIGERGELIRLER, digerGelirlersql);
    cv.put(C_TOPLAMHARCAMA,toplamHarcamasql);
    cv.put(C_TOPLAMGELIR, toplamGelirsql);
    cv.put(C_ELDEKALAN, eldeKalansql);

    String[] selectionArgs=new String[]{yilsql+"", aysql};
    String entryGirisSQL="SELECT c_id FROM harcamalar WHERE "+C_YIL+"= ? AND "+C_AY+"= ?";
    Cursor cursor=ourDatabase.rawQuery(entryGirisSQL, selectionArgs);
    cursor.moveToFirst();

    int index=cursor.getInt(cursor.getColumnIndex(C_ID));
    if(cursor.isNull(cursor.getColumnIndex(C_ID)))
        ourDatabase.insert(DB_TABLE, null, cv);
    else
        ourDatabase.update(DB_TABLE, cv, C_ID+"="+index, null);

    cursor.close();

}

受保护的 String[] getDataMain(int yilsql, String aysql){ 字符串结果[]=新字符串[25];

    String[] selectionArgs=new String[]{yilsql+"", aysql};
    String entryHesaplaSQL="SELECT * FROM harcamalar WHERE "+C_YIL+"= ? AND "+C_AY+"= ?";
    Cursor c=ourDatabase.rawQuery(entryHesaplaSQL, selectionArgs);

    if(c.moveToFirst()){

        int i_yil = c.getColumnIndex(C_YIL);
        int i_ay = c.getColumnIndex(C_AY);
        int i_bakici = c.getColumnIndex(C_BAKICI);
        int i_krediaraba = c.getColumnIndex(C_KREDIARABA);
        int i_krediogrenim = c.getColumnIndex(C_KREDIOGRENIM);
        int i_kreditatil = c.getColumnIndex(C_KREDITATIL);
        int i_faturaelektrik = c.getColumnIndex(C_FATURAELEKTRIK);
        int i_faturasu = c.getColumnIndex(C_FATURASU);
        int i_faturainternet = c.getColumnIndex(C_FATURAINTERNET);
        int i_aidat = c.getColumnIndex(C_AIDAT);
        int i_kaskosigorta = c.getColumnIndex(C_KASKOSIGORTA);

        int i_digertaksitler=c.getColumnIndex(C_DIGERTAKSITLER);
        int i_diger=c.getColumnIndex(C_DIGER);
        int i_maasselo=c.getColumnIndex(C_MAASSELO);
        int i_maashilal=c.getColumnIndex(C_MAASHILAL);
        int i_digergelirler=c.getColumnIndex(C_DIGERGELIRLER);
        int i_toplamharcama=c.getColumnIndex(C_TOPLAMHARCAMA);
        int i_toplamgelir=c.getColumnIndex(C_TOPLAMGELIR);
        int i_eldekalan=c.getColumnIndex(C_ELDEKALAN);

        result[0]=c.getString(i_yil);
        result[1]=c.getString(i_ay);
        result[2]=c.getString(i_bakici);
        result[3]=c.getString(i_krediaraba);
        result[4]=c.getString(i_krediogrenim);
        result[5]=c.getString(i_kreditatil);
        result[6]=c.getString(i_faturaelektrik);
        result[7]=c.getString(i_faturasu);
        result[8]=c.getString(i_faturainternet);
        result[9]=c.getString(i_aidat);
        result[10]=c.getString(i_kaskosigorta);
        result[11]=c.getString(i_digertaksitler);
        result[12]=c.getString(i_diger);
        result[13]=c.getString(i_maasselo);
        result[14]=c.getString(i_maashilal);
        result[15]=c.getString(i_digergelirler);
        result[16]=c.getString(i_toplamharcama);
        result[17]=c.getString(i_toplamgelir);
        result[18]=c.getString(i_eldekalan);
        c.close();
        return result;
    } else{

        final String string1= "No data!";
        for(int i=2;i<19;i++)
            result[i]=string1;

        return result; 
    }

}

}

这里是整个类的getData()方法:

    public class TemporaryDatabase {

public static final String TAG = DbHelperTemporary.class.getSimpleName();
public static final String DB_NAME = "aySonuTepmDB.sql";
private static String DB_PATH ="/data/data/com.bilge.aysonu/assets/";
public static final int DB_VERSION = 1;
public static final String DB_TABLE = "ayyil";

public static final String C_ID = "c_id";// Special for id
public static final String C_YIL = "spinnerYillar";
public static final String C_AY = "spinnerAylar";

public static final String CREATE_TABLE="CREATE TABLE ayyil (c_id integer primary key autoincrement," +
        "spinnerYillar integer,spinnerAylar TEXT);";


private DbHelperTemporary dbHelper;
private final Context ourContext;
private SQLiteDatabase ourDatabase;

public static class DbHelperTemporary extends SQLiteOpenHelper {


    public DbHelperTemporary(Context context) {

        super(context, DB_NAME, null, DB_VERSION);


    }

    @Override
    public void onCreate(SQLiteDatabase db) {

            Log.d(TAG, "onCreate sql: " + CREATE_TABLE);
            db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("drop table if exists " + DB_TABLE);
        Log.w(TAG, "onUpdate drop table " + DB_TABLE);
        onCreate(db);
    }

}

public TemporaryDatabase(Context c) {
    ourContext = c;

}

public void openDatabase() throws SQLException {
    ourDatabase = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null,
            SQLiteDatabase.OPEN_READWRITE);
}

public  void open() throws NumberFormatException {


        dbHelper = new DbHelperTemporary(ourContext);
        ourDatabase = dbHelper.getWritableDatabase();
        return ;

}

public void close() {

    dbHelper.close();
    ourDatabase.close();
}

public void Entry(int yilsql, String aysql) {

    ContentValues cv = new ContentValues();
    cv.put(C_YIL, yilsql);
    cv.put(C_AY, aysql);
    ourDatabase.delete(DB_TABLE, null, null);
    ourDatabase.insert(DB_TABLE, null, cv);
    cv.clear();
}

public String[] getData() {

    String[] columns = new String[] { C_YIL, C_AY };
    Cursor c = ourDatabase.query(DB_TABLE, null, null, null, null, null,null);
    String[] result = new String[2];

    int i_yil = c.getColumnIndex(C_YIL);
    int i_ay = c.getColumnIndex(C_AY);

    if (c.moveToFirst()) {
        result[0]=c.getString(i_yil);
        result[1]=c.getString(i_ay);
    }
    c.close();
    return result;

}

}

这里是个例外:

I/MainFragment(1838): mainFragmentonCreate
D/AndroidRuntime(1838): Shutting down VM
W/dalvikvm(1838): threadid=1: thread exiting with uncaught exception (group=0xb3d87908)
E/AndroidRuntime(1838): FATAL EXCEPTION: main
E/AndroidRuntime(1838): java.lang.NullPointerException
E/AndroidRuntime(1838):     at        com.bilge.aysonu.MainFragment.onCreateView(MainFragment.java:49)
E/AndroidRuntime(1838):atandroid.support.v4.app.Fragment.performCreateView( Fragment.java:1460)
E/AndroidRuntime(1838):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
E/AndroidRuntime(1838):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
E/AndroidRuntime(1838):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
E/AndroidRuntime(1838):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
E/AndroidRuntime(1838):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
E/AndroidRuntime(1838):     at android.os.Handler.handleCallback(Handler.java:725)
E/AndroidRuntime(1838):     at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime(1838):     at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(1838):     at android.app.ActivityThread.main(ActivityThread.java:5039)
E/AndroidRuntime(1838):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(1838):     at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(1838):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
E/AndroidRuntime(1838):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
E/AndroidRuntime(1838):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 看起来tdb.getData() 返回了一个空结果。我看不到它包含在内,因此很难调试。不过,您应该可以使用调试器轻松解决。
  • 数据库操作最好使用单独的线程。
  • 不,不是 tdb.getData(),tdb.getDataMain() 返回 null。
  • 看起来 getData() 返回具有两个空值的数组。 [空,空]

标签: java android sqlite android-fragments


【解决方案1】:

onCreateView 在生命周期中可能为时过早,无法执行访问数据库之类的操作 - 我猜您的 getActivity() 调用返回 null。

我会将数据库代码移至 onResume()

【讨论】:

  • 如果我从 MainFragment 中删除 getMainData() 方法行,代码就可以了。因为我认为 getMainData() 有问题...
  • getDataMain() 引用“我们的数据库”。你在哪里初始化那个数据库?
【解决方案2】:

好的,显然result2[0] 中的值是null,但是有太多不明确的东西。

  1. ourDatabasegetData()方法中是什么

  2. ourDatabase 是否正确打开。

  3. c 这一行Cursor c = ourDatabase.query(DB_TABLE, null, null, null, null, null,null); 的结果是什么

4. 为什么要先初始化result2 数组,然后分配它——只要这样:String[] result2=tdb.getData();

【讨论】:

  • 1. ourDatabase 是一个 SQLiteDatabase 2。是的,它已正确打开。 3. c 是游标,结果是字符串。我不明白你的意思。 4.可以如你所说。但我的类型也没有错。
  • c 的结果是什么。当您调用Integer.getInteger(result2[0]) 时,result2[0] 中的值为空。这不能用作 getInteger 的参数。如果 null 值是正确的,你应该处理这种情况 - if(result2[0] == null) result2[0] = "0";
【解决方案3】:

我发现我做错了。程序抛出;

    java.lang.NullPointerException 

在第 49 行

    result = adb.getDataMain(Integer.getInteger(result2[0]), result2[1]);

在这一行,我想将字符串解析为整数,而不是 Integer.parseInt() 方法,我使用了 Integer.getInteger() 方法。所以代码是;

    result = adb.getDataMain(Integer.parseInt(result2[0]), result2[1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2011-06-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多