【问题标题】:Accessing class private members from another class从另一个类访问类私有成员
【发布时间】:2016-07-23 18:39:54
【问题描述】:

我是编程新手,我从 Java 和 Android 开始。我想创建一个数据库,所以我遵循了官方文档:https://developer.android.com/training/basics/data-storage/databases.html

我的问题是,在 Contract 类上,创建和维护数据库的成员是私有字符串(SQL_CREATE_ENTRIES 和 SQL_DELETE_ENTRIES)。在另一个文件上定义 DBHelper 类,我只是无法以文档中显示的方式访问该成员(FeedReaderDbHelper 类只是使用它们,就好像它们在它的范围内一样)。所以 Android Studio 只是把这句话写成红色并说:'Cannot resolve symbol'。

我应该在这里做什么?我还阅读了关于不建议将 setter/getter 用于 Android 的文档。

【问题讨论】:

  • 您可以使用其他解决方案,例如 Realm Java 来处理您的数据库需求;它更容易,并以优化的方式为您处理一切
  • setters/getters 不推荐用于 Android -- 不知道你在哪里读到...

标签: java android class contract


【解决方案1】:

SQL_CREATE_ENTRIESSQL_DELETE_ENTRIES 放入DBHelper 类中。

来自文档,

“契约类是定义 URI、表和列名称的常量的容器。”

只有数据库的模式应该放在那里。与更改数据库有关的逻辑应放在DBHelper 类中。

【讨论】:

    【解决方案2】:

    在 Contract 类上,创建和维护数据库的成员是私有字符串(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";
            ...
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多