2017-05-08 124 views
2

我在android studio上工作,我遇到了一個問題,我不能初始化我的DataHandler類中的我的sqlite實例,但我可以在我的MainActivity類中初始化它。這是在MainActivity中初始化SQLite的正確方法嗎?

實施例: MainActivity類別:

public class MainActivity extends AppCompatActivity { 

private RecyclerView recyclerView; 
private RecyclerView.LayoutManager layoutManager; 
private RecyclerView.Adapter adapter; 

//valid 
private SQLiteDatabase sqLiteDatabase = openOrCreateDatabase("Database", Context.MODE_PRIVATE , null); //... 
中的DataHandler類

public class DataHandler { 
public static String[] names,dates; 

//invalid: cannot resolve method 
SQLiteDatabase sqLiteDatabase = openOrCreateDatabase("HMDB", Context.MODE_PRIVATE , null); 

所以,我沒有在主活動此

public SQLiteDatabase getSqLiteDatabase() { 
    return sqLiteDatabase; 
} 

在數據處理程序中:

MainActivity mainActivity; 
SQLiteDatabase sqLiteDatabase = mainActivity.getSqLiteDatabase(); 

這是正確的方法嗎?有沒有更好的方法? sry如果難以理解

+0

不,這不是最好的方式來做到這一點。很難說出什麼問題,但第一個猜測是你不在'DataHandler'類中導入'SQLiteDatabase'。但是,爲此使用'SQLiteOpenHelper'更爲常見。 – Gary99

+0

我想在這裏你可以獲取更多信息https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper –

回答

0

最好的方法是使用Singleton模式如下描述 https://github.com/codepath/android_guides/wiki/Local-Databases-with-SQLiteOpenHelper

public class PostsDatabaseHelper extends SQLiteOpenHelper { 
    private static PostsDatabaseHelper sInstance; 

    // ... 

    public static synchronized PostsDatabaseHelper getInstance(Context context) { 
    // Use the application context, which will ensure that you 
    // don't accidentally leak an Activity's context. 
    if (sInstance == null) { 
     sInstance = new PostsDatabaseHelper(context.getApplicationContext()); 
    } 
    return sInstance; 
    } 

    /** 
    * Constructor should be private to prevent direct instantiation. 
    * Make a call to the static method "getInstance()" instead. 
    */ 
    private PostsDatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

而在你MainActivity使用它就像

// In any activity just pass the context and use the singleton method 
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(this); 
// or 
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(context); 
// or 
PostsDatabaseHelper helper = PostsDatabaseHelper.getInstance(getActivity()); 
// Do something with data via Cursor and 
helper.close(); 

這種方法完美的適合從不同的地方訪問數據庫,如服務,碎片等...

3

這是正確的方法嗎?

項目運行時是否引發任何錯誤?

這是我常在數據庫處理器(只是共享)

public class DatabaseHandler extends SQLiteOpenHelper { 
    public static final String DATABASE_NAME = "DATA.db"; 
    public static final String TABLE_NAME = "TITLE"; 
    public static final String COL0 = "ID"; 
    public static final String COL1 = "TODO"; 
    public static final String COL2 = "DETAIL"; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, 1); 
    } 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, TODO TEXT, DETAIL TEXT)"; 
     db.execSQL(createTable); } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("drop if database is exists" + TABLE_NAME); 
     onCreate(db); 
    } 
} 

MainActivity,聲明此行

DatabaseHandler db; 

onCreate方法,初始化數據庫處理器

db = new DatabaseHandler(this); 

當你想使用SQLite數據庫,請確保您有這條線

SQLiteDatabase db = this.getWritableDatabase(); 
+0

感謝它的工作 –

+0

ca我使用我的方式從mainactivity獲取文件 –

+0

你是什麼文件意思? –

相關問題