我写了一个SQLiteOpenHelper的子类假如叫做DBOpenHelper,然后创建对象,需要传入的第一个参数是Context类型的。以前我在同一个包下面创建一个Activity比如叫做SQLiteActivity,里面加一些按钮之类的,创建数据库,升级数据库,都没什么问题,因为该Context参数可以直接叫做SQLiteActivity.this,这样就工作正常。但是现在我并不想把创建数据库,升级数据库这些封装成一个Activity,只是当作工具类被调用,这样我就不知道Context参数该传什么值了???请教高人指点

解决方案 »

  1.   

    就是SQLiteOpenHelper用到了Context提供的方法,所以必须传,但是尽量不用和Activity的那个Context,用和Applicatoin关联的,因为Application是在整个应用生命周期一直存在的。
      

  2.   

    实际上相当于一个shell的指针
      

  3.   


    不好意思,我还是不太明白。我使用了context.getApplicationContext()作为context参数,还是不执行,不知道这样对不对。
      

  4.   

    请问楼主,你应该是在继承Activity的类中用到这个工具类吧,那你把该Activity.this作为参数传进来就可以。
      

  5.   

    SQLiteActivity.this不就是context么。你再构造函数中传过来不可以么。。
      

  6.   


    我没有继承Activity,直接创建了一个普通的java类。不知道是不是这样不行?:)
      

  7.   


    以前是这样的,然后这样确实也工作,但是现在我并不想创建成为Activity,只是想把它作为一个中间过程,被调用就行。不知道能不能这样做,请指教一下:)
      

  8.   

    在构造函数中传过来。你的工具类就不是Activity了呗。
    贴代码吧package com.jftt.smart.db;
    import com.jftt.smart.data.Const;import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;/**
     * class name:SQLiteOpenHelper<BR>
     * class description:<BR>
     * PS: <BR>
     * 
     * @version 1.00 2011/09/21
     * @author CODYY)peijiangping
     */
    public class DB extends SQLiteOpenHelper {
    private final static String DATEBASE_NAME = "smart scence.db";
    private final static int DATABASE_VERSION = 1; private final static String TABLE_ROUTINE = "routine";
    private final static String TABLE_DETAIL = "routine_detail"; private final static String TABLE_SCENCE = "scene"; public DB(Context context) {
    super(context, DATEBASE_NAME, null, DATABASE_VERSION);
    } @Override
    public void onCreate(SQLiteDatabase db) { // 情景模式表
    String sql = "CREATE TABLE "
    + TABLE_SCENCE
    + "(_id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,"
    + "icon INTEGER,"
    + "name TEXT,"
    + "run NUMERIC,"
    // + "ringtones INTEGER NOT NULL ,"
    + "r_ring NONE,"
    // + "volume INTEGER NOT NULL CONSTRAINT fk_volume_id REFERENCES volume(_id) ON DELETE CASCADE,"
    + "v_ring INTEGER," + "v_media INTEGER," + "v_clock INTEGER,"
    + "v_inform INTEGER,"
    + "shake NUMERIC,"
    + "wallpaper NONE," + "topics NONE," + "backlight INTEGER,"
    + "backlightTime INTEGER," + "bluetooth NUMERIC,"
    + "re TEXT)";
    db.execSQL(sql);
    // 作息模式表
    sql = "CREATE TABLE " + TABLE_ROUTINE
    + "(_id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,"
    + "name TEXT NOT NULL," + "run NUMERIC NOT NULL,"+ "tempset NUMERIC,"
    + "re TEXT)";
    db.execSQL(sql); // 作息明细表
    sql = "CREATE TABLE "
    + TABLE_DETAIL
    + "(_id INTEGER DEFAULT '1' NOT NULL PRIMARY KEY AUTOINCREMENT,"
    + "rest_id INTEGER,"
    + "ss_id INTEGER,"
    + "packagename TEXT,"
    + "labelname TEXT,"
    + "wifi NUMERIC," 
    + "flightmode NUMERIC,"
    + "week TEXT,"
    + "starttime NUMERIC,"
    + "endtime NUMERIC,"
    + "re TEXT)";
    db.execSQL(sql);
    // 标准
    sql = "insert into scene(name,run,r_ring,v_ring,v_media,v_clock,v_inform,shake,backlight,backlightTime,bluetooth,re) values(?,?,?,?,?,?,?,?,?,?,?,?)";
    db.execSQL(sql, new Object[] { Const.MODE_GENERAL, 1, "Riffing.mp3",
    5, 10, 5, 5,0,128,60,0,"General Mode"});

    // 震动
    sql = "insert into scene(name,run,r_ring,v_ring,v_media,v_clock,v_inform,shake,backlight,backlightTime,bluetooth,re) values(?,?,?,?,?,?,?,?,?,?,?,?)";

    db.execSQL(sql, new Object[] { Const.MODE_VIBRATE, 0, "Riffing.mp3",
    0, 0, 0, 0,1,128,60,0,"Vibrate Mode"});
    // 静音
    sql = "insert into scene(name,run,r_ring,v_ring,v_media,v_clock,v_inform,shake,backlight,backlightTime,bluetooth,re) values(?,?,?,?,?,?,?,?,?,?,?,?)";
    db.execSQL(sql, new Object[] {Const.MODE_SILENT, 0, "Riffing.mp3",
    0, 0, 0, 0,0,128,60,0,"Silent"});

    } @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    String sql = "DROP TABLE IF EXISTS " + TABLE_ROUTINE;
    db.execSQL(sql);

    sql = "DROP TABLE IF EXISTS " + TABLE_DETAIL;
    db.execSQL(sql);

    // sql = "DROP TABLE IF EXISTS " + TABLE_RING;
    // db.execSQL(sql);
    //
    // sql = "DROP TABLE IF EXISTS " + TABLE_VOLUMe;
    // db.execSQL(sql);

    sql = "DROP TABLE IF EXISTS " + TABLE_SCENCE;
    db.execSQL(sql);

    onCreate(db);
    }
    //
    // /**
    //  * DB操作[增、删、改]
    //  * @param sql
    //  * @param args
    //  */
    public void execSQL(String sql, Object[] args){
    SQLiteDatabase db = this.getReadableDatabase();
    db.execSQL(sql,args);
    }

    /**
     * DB查询
     * @param sql
     * @param args
     * @return
     */
    public Cursor query(String sql, String[] args){
    SQLiteDatabase db = this.getReadableDatabase();
    return db.rawQuery(sql, args);
    }
     
    /*
     * create table foo ( id INTEGER NOT NULL PRIMARY KEY );
     * 
     * CREATE TABLE bar ( id INTEGER NOT NULL PRIMARY KEY, foo_id INTEGER NOT
     * NULL CONSTRAINT fk_foo_id REFERENCES foo(id) ON DELETE CASCADE ); CREATE
     * TRIGGER fki_bar_foo_id BEFORE INSERT ON bar FOR EACH ROW BEGIN SELECT
     * RAISE(ROLLBACK, 'insert on table "bar" violates foreign key constraint
     * "fk_foo_id"') WHERE (SELECT id FROM foo WHERE id = NEW.foo_id) IS NULL;
     * END; CREATE TRIGGER fkd_bar_foo_id BEFORE DELETE ON foo FOR EACH ROW
     * BEGIN SELECT RAISE(ROLLBACK, 'delete on table "foo" violates foreign key
     * constraint "fk_foo_id"') WHERE (SELECT foo_id FROM bar WHERE foo_id =
     * OLD.id) IS NOT NULL; END;
     */
    }