【问题标题】:Cannot resolve method onAttach() in SQLiteOpenHelper无法解析 SQLiteOpenHelper 中的 onAttach() 方法
【发布时间】:2016-05-17 22:21:37
【问题描述】:

我正在尝试从扩展 SQLiteOpenHelper 的类调用方法(HomeFragment 中的 createButton)。我正在使用 getSupportFragmentManager 打开这个片段,所以我需要传递上下文来使用这个 getSupportFragmentManager 而不会出错。我尝试过以这种方式使用上下文:

private FragmentActivity myContext;

@Override
public void onAttach(Context context) {
    myContext=(FragmentActivity) context;
    super.onAttach(context);
}

public void buttonCreator(Drawable d,String a) {

    Log.d("tag_name", "buttonCreator" + myContext);

    HomeFragment homeFragment = (HomeFragment)myContext.getSupportFragmentManager().getFragments().get(1);
    homeFragment.createButton(d, a);
}

但调用“super.onAttach(context)”时出现错误,无法解析 onAttach() 方法。 有没有办法可以在 SQLiteOpenHelper 中使用 onAttach() 以便我可以访问 getSupportFragmentManager 来打开我的片段?

我也尝试过以这种方式访问​​上下文: 但是当我这样做时,它“无法解析方法'getSupportFragmentManager()'”

private Context mContext;


public DatabaseStructure(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    Log.d("tag_name", "Entered DatabaseStructure" + context);
    mContext = context;
} 

    public void buttonCreator(Drawable d,String a) {

    Log.d("tag_name", "buttonCreator" + myContext);

    HomeFragment homeFragment = (HomeFragment)mContext.getSupportFragmentManager().getFragments().get(1);
    homeFragment.createButton(d, a);
}

这是完整的课程代码:

public class DatabaseStructure extends SQLiteOpenHelper {

// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "database";

// Table Names
private static final String DB_TABLE = "table_image";

// column names
private static final String KEY_NAME = "image_name";
private static final String KEY_IMAGE = "image_data";


// Table create statement
private static final String CREATE_TABLE_IMAGE = "CREATE TABLE " + DB_TABLE + "("+
        KEY_NAME + " TEXT," +
        KEY_IMAGE + " BLOB);";


private Context mContext;


public DatabaseStructure(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    Log.d("tag_name", "Entered DatabaseStructure" + context);
    mContext = context;
}

@Override
public void onCreate(SQLiteDatabase db) {
    // creating table
    db.execSQL(CREATE_TABLE_IMAGE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // on upgrade drop older tables
    db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE);

    // create new table
    onCreate(db);
}

public void addEntry( String name, byte[] image) throws SQLiteException {

    SQLiteDatabase db = this.getWritableDatabase();
    Log.d("tag_name", "Enter Add Entry" + db);
    ContentValues cv = new  ContentValues();
    cv.put(KEY_NAME,    name);
    cv.put(KEY_IMAGE, image);
    db.insert(DB_TABLE, null, cv);
}



public boolean checkDatabase() {

    Log.d("tag_name", "In CheckDatabase method" );

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor mCursor = db.rawQuery("SELECT * FROM " + DB_TABLE, null);


    if (mCursor.moveToFirst())
    {

        mCursor.moveToFirst();
        String appName = mCursor.getString(0);
        byte[] image = mCursor.getBlob(1);


        Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
        Drawable d = new BitmapDrawable(Resources.getSystem(), bitmap);
        //Drawable d = new BitmapDrawable(bitmap);

        buttonCreator(d, appName);


        return true;

    } else
    {


        return false;
    }

}



private FragmentActivity myContext;

@Override
public void onAttach(Context context) {
    myContext=(FragmentActivity) context;
    super.onAttach(context);
}




public void buttonCreator(Drawable d,String a) {

    Log.d("tag_name", "buttonCreator" + myContext);

    HomeFragment homeFragment = (HomeFragment)myContext.getSupportFragmentManager().getFragments().get(1);
    homeFragment.createButton(d, a);
}
}

【问题讨论】:

  • 我对这段代码与SQLiteOpenHelper 的关系一无所知。你可以发布完整的课程吗?只需删除本主题不需要的方法即可。
  • 你为什么要从一个只负责管理数据库的类中做与视图相关的事情?通常情况正好相反。
  • @ghostman 我发布了完整的 Activity,它扩展了 SQLiteOpenHelper。
  • @Natalie уже ответили)
  • @EugenPechanec 我正在根据用户操作将图像和字符串保存在数据库中。然后我想检查数据库是否为空。如果它不为空,我想打开一个新活动并将存储在数据库中的值传递给它。有没有更好的方法来解决这个问题?

标签: java android sqlite android-fragments


【解决方案1】:

onAttach()Fragment 的回调方法,您可以覆盖它以在片段类中附加侦听器或其他内容。

正如您所说,您从 SQLiteOpenHelper 扩展了您的类,因此您没有任何 onAttach() 方法可以覆盖。 所以回答

有没有办法可以在SQLiteOpenHelper 中使用 onAttach() 以便我可以 访问 getSupportFragmentManager 以打开我的片段?

--

另外,关于如何获取上下文,我不知道你为什么要将你的类扩展到SQLiteOpenHelper,但如果你想获取上下文来开始你的片段或使用getSupportFragmentManager(),你可以将上下文传递给当你创建它的对象时那个类。

【讨论】:

  • 感谢您的反馈。您说“您可以在创建对象时传递该类中的上下文”。但是我怎样才能传递上下文,所以我不会得到 context=null?
  • 你已经运行了活动,从中获取上下文
  • 但是您应该在附加片段时打开数据库连接。使用 Loader 在后台处理数据库的最佳方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2015-06-10
  • 2019-08-28
相关资源
最近更新 更多