2016-05-17 3 views
-2

Я пытаюсь вызвать метод (createButton in HomeFragment) из класса, который расширяет SQLiteOpenHelper. Я использую getSupportFragmentManager, чтобы открыть этот фрагмент, и поэтому мне нужно передать контекст, чтобы использовать этот getSupportFragmentManager без ошибок. Я попытался с помощью контекста таким образом:Не удается разрешить метод onAttach() в SQLiteOpenHelper

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 (контекст)», что метод onAttach() не может быть решена. Есть ли способ, которым я могу использовать onAttach() в SQLiteOpenHelper, чтобы я мог получить доступ к 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); 
} 
} 
+1

Я ничего не понял, как этот код относится к 'SQLiteOpenHelper'. Можете ли вы отправить полные классы? Просто удалите методы, которые не нужны для этой темы. –

+0

Зачем вам нужно делать что-либо, связанное с представлениями из класса, единственная ответственность которого заключается в управлении базой данных? Обычно это наоборот. –

+0

@ghostman Я отправил полную активность, которая расширяет SQLiteOpenHelper. – Natalie

ответ

3

onAttach() - это метод обратного вызова Fragment, который вы можете переопределить для присоединения слушателей или другого материала в вашем классе фрагмента.

По тому, что вы сказали, вы расширяете свой класс от SQLiteOpenHelper и, следовательно, у вас нет onAttach() метода для переопределения. Таким образом, ответ на

Есть ли способ, что я могу использовать onAttach() в SQLiteOpenHelper так, что я могу getSupportFragmentManager доступа, чтобы открыть свой фрагмент?

- NO.

Кроме того, в отношении того, как вы можете получить контекст, я не знаю, почему вы расширяете свой класс до SQLiteOpenHelper, но если вы хотите получить контекст для начала фрагмента или использовать getSupportFragmentManager(), вы можете передать контекст в этом классе, если вы создаете свой объект.

+0

Спасибо за отзыв. Вы говорите «вы можете передать контекст в этом классе при создании своего объекта». Но как я могу передать контекст, поэтому я не получаю context = null? – Natalie

+0

Вы запустили активность, получите контекст из него –

+0

Но вам нужно открыть соединение с базой данных, когда ваш фрагмент подключен. Лучший способ использования Loader для работы с базой данных в фоновом режиме. –

Смежные вопросы