Error:Error: This class should provide a default constructor (a public constructor with no arguments)

Error:Error: This class should provide a default constructor (a public constructor with no arguments)

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

Error:Error: This class should provide a default constructor (a public constructor with no arguments) (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;
    }
}

您的 class 的唯一构造函数是这个

public Database (Context context){
    ...
}

它以一个上下文作为参数。您得到的错误是告诉您它需要一个 没有 任何参数的构造函数。像这样。

public Database(){
    ...
}

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

您需要定义一个不带任何参数的构造函数(就像默认构造函数一样,java 在您没有编写时隐式提供给您)。因为你有一个参数化的构造函数,所以编译器不生成隐式构造函数。

像下面这样定义一个构造函数,它将解决问题。

public Database() {
}