我正在创建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有私人访问”
甚至可以这样做吗?
答案 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个要求时使用:
鉴于这些要求,内部类可以完全访问其外部类。因为它们基本上是外部类的成员,所以它们可以访问外部类的方法和属性 - 包括私有
以下是:
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");
}
}