Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法解析SQLiteOpenHelper中的方法onAttach()_Java_Android_Sqlite_Android Fragments - Fatal编程技术网

Java 无法解析SQLiteOpenHelper中的方法onAttach()

Java 无法解析SQLiteOpenHelper中的方法onAttach(),java,android,sqlite,android-fragments,Java,Android,Sqlite,Android Fragments,我试图从扩展SQLiteOpenHelper的类调用一个方法(HomeFragment中的createButton)。我正在使用getSupportFragmentManager打开此片段,因此我需要传递上下文才能正确使用此getSupportFragmentManager。我尝试过以这种方式使用上下文: private FragmentActivity myContext; @Override public void onAttach(Context context) { myCon

我试图从扩展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()'”

以下是完整的类代码:

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);
}
}
onAttach()
Fragment
的回调方法,您可以重写该方法来附加侦听器或Fragment类中的其他内容

根据您所说的,您从
SQLiteOpenHelper
扩展了类,因此您没有任何
onAttach()
方法可以重写。 那么答案是什么呢

是否有一种方法可以在
SQLiteOpenHelper
中使用onAttach(),以便 访问getSupportFragmentManager以打开我的片段

--


另外,关于如何获取上下文,我不知道为什么要将类扩展到
SQLiteOpenHelper
,但是如果要获取上下文来启动片段或使用
getSupportFragmentManager()
,您可以在创建其对象时在该类中传递上下文。

我完全不了解此代码与
SQLiteOpenHelper
的关系。你能发布完整的课程吗?只需删除本主题不需要的方法。为什么要从一个只负责管理数据库的类中执行与视图相关的操作?通常情况下是相反的。@ghostman我发布了完整的活动,它扩展了SQLiteOpenHelper。@Natalieжжжжжжжжжжжжжжжжа。然后我想检查数据库是否为空。如果它不是空的,我想打开一个新的活动,并将存储在数据库中的值传递给它。有没有更好的方法呢?谢谢你的反馈。您说“当您创建该类的对象时,您可以在该类中传递上下文”。但我怎样才能传递context,这样我就不会得到context=null?您已经运行了activity,从中获得了context,但是当您的片段被附加时,您应该打开数据库连接。使用Loader在后台处理数据库的最佳方法。
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);
}
}