2017-09-11 92 views
2

我創建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

將您FeedReaderDbHelper全班分成單獨的文件 –

+2

爲什麼你到底是執行它作爲一個內部類?在這個例子中,它顯然是一個單獨的課程。 –

+0

爲什麼你不能公開構造函數? –

回答

1
MyDbHandler has a private access 

這不是內部類,它是關於在構造函數類

private MyDBHandler() { 
} 

我想我以前看過這個指南(網站),我不知道他們爲什麼把它作爲內部類加入。我記得他們說要讓構造函數是私有的,所以沒有人可以創建一個對象。 因此只需將FeedReaderDbHelper移至單獨的文件,然後就可以工作。

但是,如果由於某種原因,你要保持它的內部類,然後把它定義爲靜態

public static class FeedReaderDbHelper 

然後調用相同的代碼,它應該工作

+0

問題是,當我將FeedReaderDbHelper移動到單獨的文件時,它只是無法訪問變量,如SQL_DELETE_ENTRIES。我將不得不創建getters來解決它。它會是一個最佳解決方案嗎? – Mike

+0

ofcourse它有訪問他們是decalered公共靜態,所以你可以訪問它們像這樣CLASS_NAME.STATIC_PUBLIC_VARS,否則getters只會是最佳的一個是的 –

+0

是啊,我只是想盡可能多地堅持它只是可能的這個Android開發指南,那裏的私人物品。無論如何,我只會使用getters。 – Mike

2

如果你真的想保持你內心的類,然後讓它靜止,並用它如下:

new MyDBHandler.FeedReaderDbHelper(getContext())

0

內部類是隻是一種乾淨分離出真正屬於原始外部類的一些功能。他們的目的是用來當你有2個要求:

  1. 部分的一些功能在外部類,如果它是在一個單獨的類中實現的將是最明顯的 。
  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"); 
     } 
    } 
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) 
相關問題