2016-09-09 157 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

相关问题