2011-10-29 12 views
0

データベースからランダムなReceiptを表示するホーム画面ウィジェットを作成したいと思います。実際には、データベースを開くコマンドでエラーが発生しました。Android:データベースからウィジェットデータを取得

私はそれを動作させるために何ができるのですか?通常、このコードは通常のアクティビティで動作しますが、ウィジェットとして使用できますか?

package com.droidfish.apps.acli; 

import java.util.Random; 

import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.Context; 
import android.database.Cursor; 
import android.util.Log; 
import android.widget.RemoteViews; 
import android.widget.Toast; 

public class RecieptOfTheDayWidget extends AppWidgetProvider { 
static DataBaseHelper dbh; 

public void onDeleted(Context context, int[] appWidgetIds) { 
    // TODO Auto-generated method stub 
    super.onDeleted(context, appWidgetIds); 
    Toast.makeText(context, "widget deleted", Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 
    // TODO Auto-generated method stub 
    super.onUpdate(context, appWidgetManager, appWidgetIds); 

    final int iN = appWidgetIds.length; 

    updateWidgetContent(context, appWidgetManager, appWidgetIds); 
} 

public static void updateWidgetContent(Context context, 
     AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    dbh.openDataBase(); 
    String sNameVariant = "basestring"; 
    Cursor c1 = dbh.rawQuery("SELECT _id from reciept"); 
    Random r = new Random(); 
    int iRandomID = 1; 
    int iVName = c1.getColumnIndex("name"); 
    int iCountDataSet; 
    for (c1.moveToFirst(); !c1.isAfterLast(); c1.moveToNext()) { 
     iCountDataSet = c1.getCount(); 
     iRandomID = r.nextInt(iCountDataSet); 
     Log.d("Random: ", (Integer.toString(iRandomID))); 

    } 
    Cursor c2 = dbh 
      .rawQuery("SELECT name FROM reciept WHERE _id = " 
        + iRandomID); 
    for (c2.moveToFirst(); !c2.isAfterLast(); c2.moveToNext()) { 
     sNameVariant = c2.getString(iVName); 
    } 
    RemoteViews vView1 = new RemoteViews(context.getPackageName(), 
      R.layout.recieptofthedaywidget); 

    vView1.setTextViewText(R.id.tvWidgetReciept, sNameVariant); 
    dbh.close(); 

    appWidgetManager.updateAppWidget(appWidgetIds, vView1); 
} 
} 

おかげでピーター


UPDATE#1:
おかげカーティス、

私はこの

private static DataBaseHelper getDatabaseHelper(Context context) { 
    DataBaseHelper dbh = null; 
    if (dbh == null) { 
     dbh = new DataBaseHelper(context); 
     dbh.openDataBase(); 
    } 
    return dbh; 
} 
のようなあなたの方法を追加しました

今、このエラーを取得が

10-30 08:32:53.882: E/AndroidRuntime(296): java.lang.RuntimeException: Unable to start receiver com.droidfish.apps.acli.RecieptOfTheDayWidget: java.lang.IllegalStateException: get field slot from row 0 col -1 failed 

それはのように見えるその列数の範囲からランダムな番号を取得できません。これは正しいですか?実際には、私が書くと同じエラーが発生します。

iRandomID = r.nextInt(3); 

Mhh thats really interesting。助言がありますか?


UPDATE#2:
私はこのように私のコードを変更し、それが動作します。行方不明SOM重要な行は、あなたのデータベースのヘルパークラスを初期化することはありませんように見える、

おかげで再び

 Cursor c1 =getDatabaseHelper(context).getReadableDatabase().rawQuery("SELECT _id from reciept_variant", null); 
    Random r = new Random(); 
    int iRandomID = 1; 
    int iVName = c1.getColumnIndex("_id"); 
    int iCountDataSet; 
    for (c1.moveToFirst(); !c1.isAfterLast(); c1.moveToNext()) { 
     iCountDataSet = c1.getCount(); 
     //iRandomID = r.nextInt(3); 
     iRandomID = r.nextInt(iCountDataSet); 
     Log.d("Random: ", (Integer.toString(iRandomID))); 

    } 
    Cursor c2 = getDatabaseHelper(context).getReadableDatabase().rawQuery("SELECT _id, name FROM reciept_variant WHERE _id = 3" 
       , null); 

    int iName2 = c2.getColumnIndex("name"); 
    for (c2.moveToFirst(); !c2.isAfterLast(); c2.moveToNext()) { 
     sNameVariant = c2.getString(iName2); 
    } 
+0

Peter、問題をよりよく診断できるように、logcatのエラー出力を含めてください。 –

答えて

0

ピーター))):)がありました。したがって、nullに設定されているため、おそらくNULLポインタ例外が発生しています。あなたはDBHを使用する必要があるたび

private static DataBaseHelper getDatabaseHelper(){ 
    if(dbh==null){ 
    dbh = new DatabaseHelper(/* put your database helper arguments here */); 
    dbh.openDatabase(); 
    } 
    return dbh; 
} 

その後、あなたはgetDatabaseHelperを呼び出します。次のコードを追加してみてください。たとえば、updateWidgetContent()メソッドで次のようにします。

Cursor c1 = getDatabaseHelper().getReadableDatabase().rawQuery("SELECT _id from reciept"); 
関連する問題