2016-07-23 105 views
1

我是編程新手,我從Java和Android開始。我想創建一個數據庫,所以我遵循官方文檔:https://developer.android.com/training/basics/data-storage/databases.html從另一個類訪問類私有成員

我在Contract類上創建和維護數據庫的成員是私有字符串(SQL_CREATE_ENTRIES和SQL_DELETE_ENTRIES)時出現問題。在另一個文件中定義DBHelper類時,我只是無法像訪問文檔那樣訪問該成員(FeedReaderDbHelper類只是將它們用在了範圍內)。所以Android Studio只是把這句話放在紅色上,並說:'無法解析符號'。

我應該在這裏做什麼?我已經閱讀過有關setter/getters不推薦用於Android的文檔。

+0

還有其他的解決方案,你可以使用像境界Java來處理你的數據庫的需求;它更簡單,並以優化的方式爲您處理所有事情 – Eenvincible

+1

* setter/getters不推薦用於Android * - 不知道您在哪裏閱讀... –

回答

3

SQL_CREATE_ENTRIESSQL_DELETE_ENTRIES放在DBHelper類中。

從文檔,

「A合同類是定義的URI,表和列名的常量的容器。」

只有數據庫的模式應該放在那裏。有關修改數據庫的邏輯應放在DBHelper類中。

0

在合同類,成員創建和維護數據庫是私有的字符串(SQL_CREATE_ENTRIESSQL_DELETE_ENTRIES)。定義在另一個文件中DBHelper類,我只是不能訪問該成員就出現在該文檔的方式(在FeedReaderDbHelper類只使用他們,如果他們裏面範圍)

那些private領域都應該被放置進入SQLiteOpenHelper班。它們在該類的範圍內用於創建和刪除由該類管理的表。你不應該在其他地方使用這些SQL字符串。

例如,

public class FeedReaderDbHelper extends SQLiteOpenHelper { 

    private static final String TEXT_TYPE = " TEXT"; 
    private static final String COMMA_SEP = ","; 
    private static final String SQL_CREATE_ENTRIES = 
     "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" + 
     FeedEntry._ID + " INTEGER PRIMARY KEY," + 
     FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP + 
     FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP + 
     ... // Any other options for the CREATE command 
     ")"; 

    private static final String SQL_DELETE_ENTRIES = 
     "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME; 

    // If you change the database schema, you must increment the database version. 
    public static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_NAME = "FeedReader.db"; 

    public FeedReaderDbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(SQL_CREATE_ENTRIES); 
    } 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // This database is only a cache for online data, so its upgrade policy is 
     // to simply to discard the data and start over 
     db.execSQL(SQL_DELETE_ENTRIES); 
     onCreate(db); 
    } 

    /* Inner class that defines the table contents */ 
    public static abstract class FeedEntry implements BaseColumns { 
     public static final String TABLE_NAME = "entry"; 
     public static final String COLUMN_NAME_ENTRY_ID = "entryid"; 
     public static final String COLUMN_NAME_TITLE = "title"; 
     public static final String COLUMN_NAME_SUBTITLE = "subtitle"; 
     ... 
    } 

}