安卓:从数据库中获取的Widget数据数据库中、数据、Widget

2023-09-06 07:20:15 作者:傲气稳了全场

我想打一个主屏幕,控件,它显示一个随机收到一个数据库。其实我得到了它打开数据库命令错误。

所以,我能做些什么,使工作?在一个正常的活动通常这code的工作....但小窗口?

 包com.droidfish.apps.acli;

导入了java.util.Random;

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

公共类RecieptOfTheDayWidget扩展AppWidgetProvider {
静态DataBaseHelper胸径;

公共无效onDeleted(上下文的背景下,INT [] appWidgetIds){
    // TODO自动生成方法存根
    super.onDeleted(背景下,appWidgetIds);
    Toast.makeText(背景下,小工具已删除,Toast.LENGTH_SHORT).show();
}

@覆盖
公共无效的OnUpdate(上下文的背景下,AppWidgetManager appWidgetManager,
        INT [] appWidgetIds){
    // TODO自动生成方法存根
    super.onUpdate(背景下,appWidgetManager,appWidgetIds);

    最终诠释IN = appWidgetIds.length;

    updateWidgetContent(背景下,appWidgetManager,appWidgetIds);
}

公共静态无效updateWidgetContent(上下文的背景下,
        AppWidgetManager appWidgetManager,INT [] appWidgetIds){
    dbh.openDataBase();
    字符串sNameVariant =basestring的;
    游标c1 = dbh.rawQuery(选择从收据_id);
    随机R =新的随机();
    INT iRandomID = 1;
    INT iVName = c1.getColumnIndex(姓名);
    INT iCountDataSet;
    为(c1.moveToFirst();!c1.isAfterLast(); c1.moveToNext()){
        iCountDataSet = c1.getCount();
        iRandomID = r.nextInt(iCountDataSet);
        Log.d(随机,(Integer.toString(iRandomID)));

    }
    游标c2 =胸径
            .rawQuery(FROM收据SELECT name其中_id =
                    + iRandomID);
    为(c2.moveToFirst();!c2.isAfterLast(); c2.moveToNext()){
        sNameVariant = c2.getString(iVName);
    }
    RemoteViews vView1 =新RemoteViews(context.getPackageName()
            R.layout.recieptofthedaywidget);

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

    appWidgetManager.updateAppWidget(appWidgetIds,vView1);
}
}
 

感谢彼得

更新#1: 感谢柯蒂斯,

我添加了这样的方法

 私有静态DataBaseHelper getDatabaseHelper(上下文的背景下){
    DataBaseHelper胸径= NULL;
    如果(胸径== NULL){
        胸径=新DataBaseHelper(上下文);
        dbh.openDataBase();
    }
    返回胸径;
}
 

但现在收到这个错误

  8月10号至三十零日:32:53.882:E / AndroidRuntime(296):java.lang.RuntimeException的:无法启动接收器com.droidfish.apps.acli.RecieptOfTheDayWidget:JAVA。 lang.IllegalStateException:获得现场插槽从第0山坳-1失败
 
借助navicat,把一个数据库里面的部分表数据,导入另一个数据库中

看起来其无法从列计数的范围内的随机数。这是正确的吗?实际上,它产生了同样的错误,当我写

  iRandomID = r.nextInt(3);
 

MHH那真的很有趣。有什么建议么?

更新#2: 我改变了我的code这样的,它的工作。有索姆重要的线缺失:))))

再次感谢

 游标c1 = getDatabaseHelper(上下文).getReadableDatabase()rawQuery(选择从reciept_variant _id,NULL);
    随机R =新的随机();
    INT iRandomID = 1;
    INT iVName = c1.getColumnIndex(_ ID);
    INT iCountDataSet;
    为(c1.moveToFirst();!c1.isAfterLast(); c1.moveToNext()){
        iCountDataSet = c1.getCount();
        // iRandomID = r.nextInt(3);
        iRandomID = r.nextInt(iCountDataSet);
        Log.d(随机,(Integer.toString(iRandomID)));

    }
    游标c2 = getDatabaseHelper(上下文).getReadableDatabase()。rawQuery(选择_id从reciept_variant名在_id = 3
                , 空值);

    INT iName2 = c2.getColumnIndex(姓名);
    为(c2.moveToFirst();!c2.isAfterLast(); c2.moveToNext()){
        sNameVariant = c2.getString(iName2);
    }
 

解决方案

彼得,它看起来像你从来没有初始化数据库辅助类。因此,它被设置为空,你可能会得到一个空指针异常。尝试添加以下code:

 私有静态DataBaseHelper getDatabaseHelper(){
  如果(胸径== NULL){
     胸径=新DatabaseHelper(/ *把你的数据库的辅助参数在这里* /);
     dbh.openDatabase();
  }
  返回胸径;
}
 

然后,每当你需要使用的胸径,你叫getDatabaseHelper。例如,在你updateWidgetContent()方法做到这一点:

 游标c1 = getDatabaseHelper()getReadableDatabase()rawQuery(选择从收据_id)。
 

I want to make a homescreen-widget which displays a random Receipt from a database. Actually I got an error on the command which opens the database.

So what I can do to make it work? Usually this code work in a normal activity....but as widget??

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);
}
}

Thanks Peter

UPDATE #1: Thanks Curtis,

i added your method like this

    private static DataBaseHelper getDatabaseHelper(Context context) {
    DataBaseHelper dbh = null;
    if (dbh == null) {
        dbh = new DataBaseHelper(context);
        dbh.openDataBase();
    }
    return dbh;
}

but now getting this error

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

It looks like its unable to get a Random number from the range of the column count. Is this right? Actually it produce the same error when i write

iRandomID = r.nextInt(3);

Mhh thats really interesting. Any suggestions?

UPDATE #2: I changed my code like this and it work. There were som important lines missing :))))

Thanks again

        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);
    }

解决方案

Peter, it looks like you never initialize your Database helper class. It is therefore set to null and you're probably getting a null pointer exception. Try adding the following code:

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

Then whenever you need to use the dbh, you call getDatabaseHelper. For instance, in you updateWidgetContent() method do this:

 Cursor c1 = getDatabaseHelper().getReadableDatabase().rawQuery("SELECT _id from reciept");