2016-09-09 203 views
0

我正在創建一個將使用SQLite數據庫的android應用程序。我創建了一個名爲DBAdapter的獨立類,其中包含與數據庫相關的所有方法。從另一個類訪問方法Android

我試圖從主要活動中訪問這些方法時出現問題。我仍然在學習,但我通常會實例化DBAdapter類,然後我將能夠引用這些方法。然而我採取的方法沒有工作。下面是我如何嘗試實例化類的單行,並且在該類下面是該類的其餘部分。

我得到的錯誤是cannot resolve method 'open()'

實例化線和方法

DBAdapter db = new DBAdapter(this); 
db.open(); 

主類

import android.app.Dialog; 
import android.content.Context; 
import android.content.SharedPreferences; 
import android.support.design.widget.FloatingActionButton; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.ContentFrameLayout; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    final Context context = this; 

    private FloatingActionButton fab; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     DBAdapter db = new DBAdapter(this); 

     db.open(); 

     fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       final Dialog dialog = new Dialog(context); 

       dialog.setContentView(R.layout.dialog_box); 
       dialog.setTitle("Add new Location!"); 
       dialog.show(); 

       final EditText NameEdit = (EditText) findViewById(R.id.NameInput); 
       final EditText LatEdit = (EditText) findViewById(R.id.LatInput); 
       final EditText LongEdit = (EditText) findViewById(R.id.LongInput); 
       final EditText PhoneEdit = (EditText) findViewById(R.id.PhoneInput); 
       final Button OkButton = (Button) dialog.findViewById(R.id.dialogButtonOK); 
       final Button CancelButton = (Button) dialog.findViewById(R.id.dialogButtonCancel); 

       OkButton.setOnClickListener(new View.OnClickListener() { 

        public void onClick(View v) { 
         String RealName = NameEdit.getText().toString(); 

         String Lat = LatEdit.getText().toString(); 
         Float realLat = Float.parseFloat(Lat); 

         String Long = LongEdit.getText().toString(); 
         Float realLong = Float.parseFloat(Long); 

         String Phone = PhoneEdit.getText().toString(); 
         Double realPhone = Double.parseDouble(Phone); 

         //Use above to create a new Geofence 


        } 
       }); 

       CancelButton.setOnClickListener(new View.OnClickListener() { 

        public void onClick(View v) { 
         dialog.dismiss(); 
        } 
       }); 

      } 

     }); 

    } 
} 

DBAdpater類

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

/** 
* Created by Rory on 09/09/2016. 
*/ 
public class DBAdapter { 

    private final Context context; 
    private DatabaseHelper DBHelper; 
    private SQLiteDatabase db; 

    //Database Version & name 
    private static final String DATABASE_NAME = "OpenSesame"; 
    private static final int DATABASE_VERSION = 1; 
    private static final String TAG = "DBMain"; 

    private static final String GEOTABLE = "geoTable"; 

    private static final String KEY_ID = "_id"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_LAT = "lat"; 
    private static final String KEY_LONG = "long"; 
    private static final String KEY_RADIUS = "radius"; 
    private static final String KEY_PHONE = "phone"; 

    private static final String CREATE_GEO_TABLE = "CREATE TABLE " 
      + GEOTABLE + "(" 
      + KEY_ID + " INTEGER PRIMARY KEY AUTO INCREMENT," 
      + KEY_NAME + " TEXT," 
      + KEY_LAT + " FLOAT," 
      + KEY_LONG + " FLOAT," 
      + KEY_RADIUS + " INTEGER," 
      + KEY_PHONE + " INTEGER" + ")"; 


    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     DBHelper = new DatabaseHelper(context); 
    } 

    private class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     /** 
     * Method to create each of the tables defined above 
     * @param db 
     */ 
     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      try { 
       db.execSQL(CREATE_GEO_TABLE); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

     /** 
     * Method for updating the database 
     * @param db 
     * @param newVersion 
     * @param oldVersion 
     */ 
     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     { 
      Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS contacts"); 
      onCreate(db); 
     } 

     public DatabaseHelper open() throws SQLException 
     { 
      db = DBHelper.getWritableDatabase(); 
      return this; 
     } 

     public void close() { 
      DBHelper.close(); 
     } 

     public Cursor DeleteGeo(String name) { 
      return db.rawQuery("delete from geoTable where name = " + name, null); 
     } 

     public long AddGeo(String name, float lat, float lon, double phone, int radius) { 
      ContentValues initialValues = new ContentValues(); 
      initialValues.put(KEY_NAME, name); 
      initialValues.put(KEY_LAT, lat); 
      initialValues.put(KEY_LONG, lon); 
      initialValues.put(KEY_PHONE, phone); 
      initialValues.put(KEY_RADIUS, radius); 

      return db.insert(GEOTABLE, null, initialValues); 

     } 

     public Cursor GetAllGeos() { 
      return db.rawQuery("select * from geoTable order by name ASC", null); 
     } 
    } 
} 
+1

發佈DB適配器代碼太 –

+0

剛剛更新了問題並添加了它 – Rory

+2

'DBAdapter'沒有'open()'方法。私有的內部類'DatabaseHelper'。你必須通過外部類來公開。 – jonhopkins

回答

1

您的DBAdapter類沒有open()方法。這是具有該方法的私人內部類DatabaseHelper。你有兩種選擇來暴露open()能夠按照你的期望來調用它。

選項1:添加一個open()方法DBAdapter調用DatabaseHelperopen()方法

public void open() { 
    DBHelper.open(); 
} 

選項2:刪除DatabaseHelper完全,並有DBAdapter extends SQLiteOpenHelper代替

public class DBAdapter extends SQLiteOpenHelper { 
    ... 
    public DBAdapter(Context ctx) { 
     this.context = ctx; 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // add all the code from inside DatabaseHelper below 

    /** 
    * Method to create each of the tables defined above 
    * @param db 
    */ 
    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     try { 
      db.execSQL(CREATE_GEO_TABLE); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

    // you will have to change this method to work 
    public DBAdapter open() throws SQLException 
    { 
     db = getWritableDatabase(); 
     return this; 
    } 

    ... 
} 
+0

感謝您的幫助! – Rory

+0

沒問題。很高興我能幫上忙,即使你在打完哈哈之前弄清楚了 – jonhopkins

相關問題