【问题标题】:SQLite No open constructor errorSQLite没有打开构造函数错误
【发布时间】:2012-08-18 02:48:44
【问题描述】:

当尝试将数据插入我的 sqlite db 时,我收到一个 logcat 错误“没有空的构造函数”。错误消息听起来很简单,但我可以理解一个 empy 构造函数将如何帮助我将数据插入到我的数据库中。

错误:

 E/AndroidRuntime(531): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.LoginScr.Example/com.LoginScr.Example.LoginDB}: java.lang.InstantiationException: can't instantiate class com.LoginScr.Example.LoginDB; no empty constructor

数据库:

  public class LoginDB extends SQLiteOpenHelper {

//Table attributes
public static final String DATABASE_NAME = "logindata.db";
public static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME_INFOTABLE = "credentials";

// Data attributes
public static final String COLUMN_NAME_USERNAME = "username";
public static final String COLUMN_NAME_PASSWORD = "password";

private SQLiteOpenHelper DBHelper;
private SQLiteDatabase db;



public LoginDB(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub      

        String sqlDataStore = "create table if not exists " +
        DATABASE_NAME + " ("+ BaseColumns._ID + " integer primary key autoincrement,"

                    + COLUMN_NAME_USERNAME + " text not null,"
                    + COLUMN_NAME_PASSWORD + " text not null);";

        db.execSQL(sqlDataStore);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        if(oldVersion == 1 && newVersion == 2){
            //Upgrade the database
    }   

}

    public boolean Login(String username, String password) throws SQLException
    {
        Cursor mCursor = db.rawQuery("SELECT * FROM " + DATABASE_NAME + " WHERE username=? AND password=?",
                new String[]{username,password});
        if(mCursor !=null) {
            if(mCursor.getCount()>0)
            {
            return true;
            }
        }
            return false;
        }

    public void open() {
        // TODO Auto-generated method stub
        db = DBHelper.getWritableDatabase();
    }
    public void close() {
        DBHelper.close();
    }
     }

活动:

      public class CredentialsActivity extends Activity implements OnClickListener{

   private Button lReg;
   private EditText lUname;
   private EditText lPword;

   private LoginDB loginDb = new LoginDB(CredentialsActivity.this);

   @Override
   protected void onCreate (Bundle savedInstanceState) {
   // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
   setContentView(R.layout.register);

   lReg = (Button)findViewById(R.id.reg_button);
   lReg.setOnClickListener(this);
   }

  public void onClick(View v) {

switch(v.getId()) {

case R.id.reg_button:
    lUname = (EditText)findViewById(R.id.reg_uname);
    lPword = (EditText)findViewById(R.id.reg_pswd);

    String uname = lUname.getText().toString();
    String pass = lPword.getText().toString();
    boolean invalid = false;

    if(uname.equals("")){
        invalid = true;
        Toast.makeText(getApplicationContext(), "Username Missing", Toast.LENGTH_SHORT).show();
    }else if(pass.equals("")){
        invalid = true;
        Toast.makeText(getApplicationContext(), "Password Missing", Toast.LENGTH_SHORT).show();
    }
    if(invalid == false){
        addEntry(uname, pass);
        Intent i_register = new Intent(CredentialsActivity.this, LoginDB.class);
        startActivity(i_register);
        finish();
}}
}
    public void onDestroy() {
        super.onDestroy();
        loginDb.close();
    }

     public void addEntry(String uname, String pass){

     SQLiteDatabase db = loginDb.getWritableDatabase();
     ContentValues values = new ContentValues();
     values.put("username", uname);
     values.put("password", pass);

     try{
         db.insert(LoginDB.DATABASE_NAME, null, values);
         Toast.makeText(getApplicationContext(), "Saved! Please login now",            Toast.LENGTH_SHORT).show();
         }catch(Exception err){
      err.printStackTrace();
     }
    }
   }

【问题讨论】:

    标签: android sqlite constructor compiler-errors logcat


    【解决方案1】:

    删除

    private LoginDB loginDb = new LoginDB(CredentialsActivity.this);
    

    而是从您的Activity 的onCreate 调用相同的:

    private LoginDB loginDb;
    void onCreate(Bundle savedInstanceState)
    {
      super.onCreate(savedInstanceState);
      loginDb = new LoginDB(CredentialsActivity.this);
    ...
    }
    

    【讨论】:

    • 建议的更改并没有更改收到的 logcat 错误。
    【解决方案2】:

    我最终不得不重写我的 DB 类以使其工作,问题是允许 SQLOpenHelper 与其他类的方法进行交互。

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2023-03-20
      • 1970-01-01
      • 2012-07-14
      • 2020-06-09
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2018-12-06
      相关资源
      最近更新 更多