使用来自另一个类

时间:2017-09-11 11:18:52

标签: java android class private

我正在创建SQL数据库,我基于this site. 问题是,我不知道如何访问内部类的方法,而外部类有私有构造函数。

public class MyDBHandler {

    private MyDBHandler() {
    }

    public static class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "Tasks";
        public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
    }

    public class FeedReaderDbHelper extends SQLiteOpenHelper {
        public static final int DATABASE_VERSION = 1;
        public static final String DATABASE_NAME = "myDatabase.db";

        public FeedReaderDbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        public long saveTasks(String title) {
            SQLiteDatabase db = this.getWritableDatabase();

            ContentValues contentValues = new ContentValues();
            contentValues.put(FeedEntry.COLUMN_NAME_TITLE, title);

            long newRowId = db.insert(FeedEntry.TABLE_NAME, null, contentValues);
            return newRowId;

        }
    }
} 

我正在尝试从另一个java文件中的onClick(View v)方法访问saveTasks(String title)方法。

我试过这样的事:

MyDBHandler.FeedReaderDbHelper dbHelper = new MyDBHandler.FeedReaderDbHelper(v.getContext());

但当然我得到一个“MyDBHandler不是一个封闭的类”错误。

OR

MyDBHandler.FeedReaderDbHelper dbHelper= new MyDBHandler().new FeedReaderDbHelper(v.getContext());

但是,Android工作室一直告诉我:“MyDbHandler有私人访问”

甚至可以这样做吗?

4 个答案:

答案 0 :(得分:2)

如果你真的想保留你的内部类,那么将它设置为静态并使用它如下:

new MyDBHandler.FeedReaderDbHelper(getContext())

答案 1 :(得分:1)

MyDbHandler has a private access

这不是关于内部类,而是关于该类

中的构造函数
private MyDBHandler() {
}

我想之前我看过这个指南(网站),我真的不知道为什么他们把它作为一个内部类添加。我记得他们说要将构造函数设为私有,所以没有人可以创建一个对象。 因此,只需将FeedReaderDbHelper移动到单独的文件,然后就可以了。

但是如果由于某种原因你想保持它的内部类,那么将它定义为静态

public static class FeedReaderDbHelper

然后调用相同的代码,它应该工作

答案 2 :(得分:1)

您可以使内部类静态使用它

public class MyDBHandler {

private MyDBHandler() {
}

public static class FeedEntry implements BaseColumns {
    public static final String TABLE_NAME = "Tasks";
    public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
}

public static class FeedReaderDbHelper extends SQLiteOpenHelper {
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "myDatabase.db";

    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public long saveTasks(String title) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(FeedEntry.COLUMN_NAME_TITLE, title);

        long newRowId = db.insert(FeedEntry.TABLE_NAME, null, contentValues);
        return newRowId;

    }
  }
} 

现在,您可以

获取FeedReaderDbHelper的实例
MyDBHandler.FeedReaderDbHelper dbHelper = new MyDBHandler.FeedReaderDbHelper(v.getContext());

并调用方法

String title = "your title";
dbHelper.saveTasks(title)

答案 3 :(得分:0)

内部类只是一种干净地分离一些真正属于原始外部类的功能的方法。它们旨在满足您的2个要求时使用:

  1. 你外层的一些功能最清楚 如果它是在一个单独的类中实现的。
  2. 即使它是在一个单独的类中,功能也非常紧密 以及外部阶级的工作方式。
  3. 鉴于这些要求,内部类可以完全访问其外部类。因为它们基本上是外部类的成员,所以它们可以访问外部类的方法和属性 - 包括私有

    以下是:

    new MyDBHandler.FeedReaderDbHelper(getContext())  
    

    <强> I have run your code by following way, Please have a look.

    public class MyDBHandler {
    
            public static FeedReaderDbHelper feedReaderDbHelper;
            private MyDBHandler() {
            }
    
            public static FeedReaderDbHelper getFeedReaderDbHelper()
            {
                if(feedReaderDbHelper == null)
                    feedReaderDbHelper = new MyDBHandler(). new FeedReaderDbHelper();
    
                return feedReaderDbHelper;
            }
            public static class FeedEntry  {
                public static final String TABLE_NAME = "Tasks";
                public static final String COLUMN_NAME_TITLE = "TASK_LABEL";
            }
    
            public class FeedReaderDbHelper  {
                public static final int DATABASE_VERSION = 1;
                public static final String DATABASE_NAME = "myDatabase.db";
    
                public FeedReaderDbHelper() {
                    //super(context, DATABASE_NAME, null, DATABASE_VERSION);
                }
    
                public long saveTasks(String title) {
                    System.out.println(title);
    
                    return 1L;
                }
            }
    
    
            public static void main(String[] args) {
                MyDBHandler.getFeedReaderDbHelper().saveTasks("title");
            }
        }