错误:错误:此类应提供默认构造函数(不带参数的公共构造函数)

时间:2017-01-22 06:12:26

标签: java android constructor apk jar-signing

每当我尝试在Android Studio中生成已签名的APK时,我都会收到此错误。

  

错误:错误:此类应提供默认构造函数(public   没有参数的构造函数)   (com.examlemenu.acer.sigsekolahku.Database)[Instantiatable]

谁能告诉我为什么会这样?

package com.examlemenu.acer.sigsekolahku;

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

import java.util.ArrayList;

public class Database extends SQLiteOpenHelper {
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "sigsekolah";
    private SQLiteDatabase DB;
    public Database (Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {creaTabel (db);}

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
    public void openWriteble(){this.DB = getWritableDatabase();}
    public void openReadtable(){this.DB = getReadableDatabase();}
    public void close(){this.DB.close();}

    public void creaTabel(SQLiteDatabase db){
        String sekolahsma = "CREATE TABLE IF NOT EXISTS sma (id INTEGER PRIMARY KEY, nisn TEXT, nama TEXT, akreditasi TEXT, alamat TEXT, keterangan TEXT)";
        db.execSQL(sekolahsma);
    }

    public long insertsma(int id, String nisn, String nama, String akreditasi, String alamat, String keterangan){
        ContentValues values = new ContentValues();
        values.put("id", id);
        values.put("nisn", nisn);
        values.put("nama", nama);
        values.put("akreditasi", akreditasi);
        values.put("alamat", alamat);
        values.put("keterangan", keterangan);
        return DB.insert("sma", null, values);
    }

    public int updatesma(int id, String nisn, String nama, String akreditasi, String alamat, String keterangan) {
        ContentValues values = new ContentValues();
        values.put("id", id);
        values.put("nisn", nisn);
        values.put("nama", nama);
        values.put("akreditasi", akreditasi);
        values.put("alamat", alamat);
        values.put("keterangan", keterangan);
        return DB.update("sma", values, "id = " + id, null);
    }


    public int deletesma(int id){return DB.delete("sma", "id = " + id, null);}


    public ArrayList<String> getsmalist(){
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery("SELECT * from sma", null);
        ArrayList<String> List = new ArrayList<>();
        cursor.moveToFirst();
        for (int i = 0; i < cursor.getCount(); i++){
            List.add(cursor.getString(cursor.getColumnIndex("nama")));
            cursor.moveToNext();
        }
        return List;
    }
}

2 个答案:

答案 0 :(得分:0)

你班上唯一的构造函数就是这个

public Database (Context context){
    ...
}

以Context作为参数。您收到的错误告诉您它需要一个没有任何参数的构造函数。这样的事情。

public Database(){
    ...
}

答案 1 :(得分:-1)

APK签名尝试创建此类的对象以验证规则,但它无法创建对象。因为它使用默认构造函数来创建对象。

你需要定义一个没有任何参数的构造函数(就像默认构造函数一样,当你还没有写一个java时,它会隐式地提供给你)。因为你有一个参数化的构造函数,这就是为什么编译器不会生成隐式构造函数。

定义如下的构造函数,它将解决问题。

public Database() {
}