2016-07-23 108 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"; 
     ... 
    } 

}