Android - 没有可用的默认构造函数

时间:2015-01-02 06:30:15

标签: java android sqlite

我有一个简单的代码,它从另一个活动中存在的SQLite代码创建一个数组列表。我想使用其他活动的参数,但保持得到错误: “android.database.sqlite.SQliteOpenHelper中没有可用的默认构造函数。”

你能告诉我我错过了什么吗?

这是第一个将SQLite数据库转换为arraylist的活动:

GpsPage.java:

 class myLocationListener implements LocationListener {

                @Override
                public void onLocationChanged(Location location) {
                    if (location != null) {
                        double pLong = location.getLongitude();
                        double pLat = location.getLatitude();
                        float pAcc = location.getAccuracy();
                        long pTime = location.getTime();
                        textLat.setText(Double.toString(pLat));
                        textLong.setText(Double.toString(pLong));
                        db.addRecord(new Record(pLong, pLat, pAcc, pTime));

                        class PersonsDatabaseHandler extends   SQLiteOpenHelper {



                            //Database Name
                            private static final String DATABASE_NAME = "RecordsDB";
                            private static final String TABLE_RECORD = "record";

                            //Table names
                        //    private static final TABLE_RECORD = "records";

                            //Get all Persons
                             ArrayList<Record> getAllPersons() {
                                ArrayList<Record> localList = new ArrayList<Record>();

                                String selectQuery = "SELECT * FROM " + TABLE_RECORD;

                                SQLiteDatabase db = this.getReadableDatabase();
                                Cursor cursor = db.rawQuery(selectQuery, null);

                                //Loops through all rows and adds them to the local list
                                if(cursor.moveToFirst())
                                {
                                    do {
                                        //Get person information
                                        Record record = new Record();
                                        record.setpLong(cursor.getDouble(0));
                                        record.setpLat(cursor.getDouble(1));
                                        record.setpAcc(cursor.getFloat(2));
                                        record.setpTime(cursor.getLong(3));

                                        //Add person to list
                                        localList.add(record);
                                    } while (cursor.moveToNext());
                                }

                                return localList;

这是数据库所在的第二个活动:

MySQLiteHelper.java:

public class MySQLiteHelper extends SQLiteOpenHelper {


    // Database Version
    private static final int DATABASE_VERSION = 1;

    // Database Name
    private static final String DATABASE_NAME = "RecordsDB";

    public MySQLiteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // SQL statement to create record table
        String CREATE_RECORD_TABLE = "CREATE TABLE RECORD ( " +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "latitude TEXT NOT NULL, " +
                "longtitude TEXT NOT NULL, " +
                "accuracy TEXT NOT NULL, " +
                "time TEXT NOT NULL )";

        // create books table
        db.execSQL(CREATE_RECORD_TABLE);
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older books table if existed
        db.execSQL("DROP TABLE IF EXISTS RECORD");

        // create fresh record table
        this.onCreate(db);
    }

    // Books table name
    private static final String TABLE_RECORD = "record";

    // Books Table Columns names
    private static final String KEY_ID = "id";
    private static final String KEY_LONG = "longtitude";
    private static final String KEY_LAT = "latitude";
    private static final String KEY_ACC = "accuracy";
    private static final String KEY_TIME = "time";

    private static final String[] COLUMNS = {KEY_ID, KEY_LONG, KEY_LAT, KEY_ACC, KEY_TIME};

    public void addRecord(Record record) {
        //for logging
        Log.d("addRecord", record.toString());

        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put(KEY_LONG, record.getpLong());
        values.put(KEY_LAT, record.getpLat());
        values.put(KEY_ACC, record.getpAcc());
        values.put(KEY_TIME, record.getpTime());

        // 3. insert
        db.insert(TABLE_RECORD, // table
                null, //nullColumnHack
                values); // key/value -> keys = column names/ values = column values

        // 4. close
        db.close();
    }

    public Record getRecord(int id) {

        // 1. get reference to readable DB
        SQLiteDatabase db = this.getReadableDatabase();

        // 2. build query
        Cursor cursor =
                db.query(TABLE_RECORD, // a. table
                        COLUMNS, // b. column names
                        " id = ?", // c. selections
                        new String[]{String.valueOf(id)}, // d. selections args
                        null, // e. group by
                        null, // f. having
                        null, // g. order by
                        null); // h. limit

        // 3. if we got results get the first one
        if (cursor != null)
            cursor.moveToFirst();

        // 4. build book object
        Record record = new Record();
        record.setID(Integer.parseInt(cursor.getString(0)));
        record.setpLat(cursor.getDouble(1));
        record.setpLong(cursor.getDouble(2));
        record.setpAcc(cursor.getFloat(2));
        record.setpTime(cursor.getLong(2));

        //log
        Log.d("getBook(" + id + ")", record.toString());

        // 5. return book
        return record;
    }

    public List<Record> getAllRecords() {
        List<Record> records = new LinkedList<Record>();

        // 1. build the query
        String query = "SELECT  * FROM " + TABLE_RECORD;

        // 2. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);

        // 3. go over each row, build book and add it to list
        Record record = null;
        if (cursor.moveToFirst()) {
            do {
                record = new Record();
                record.setID(Integer.parseInt(cursor.getString(0)));
                record.setpLat(cursor.getDouble(1));
                record.setpLong(cursor.getDouble(2));
                record.setpAcc(cursor.getFloat(2));
                record.setpTime(cursor.getLong(2));


                // Add book to books
                records.add(record);
            } while (cursor.moveToNext());
        }

        Log.d("getAllRecords()", record.toString());

        // return books
        return records;
    }

    public int UpdateRecords(Record record) {

        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put("Latitude", record.getpLat()); //
        values.put("Longtitude", record.getpLong());
        values.put("Accuracy", record.getpAcc());
        values.put("Time", record.getpTime());

        // 3. updating row
        int i = db.update(TABLE_RECORD, //table
                values, // column/value
                KEY_ID + " = ?", // selections
                new String[]{String.valueOf(record.getID())}); //selection args

        // 4. close
        db.close();

        return i;

    }

    public void deleteRecords(Record record) {

        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. delete
        db.delete(TABLE_RECORD, //table name
                KEY_ID + " = ?",  // selections
                new String[]{String.valueOf(record.getID())}); //selections args

        // 3. close
        db.close();

        //log
        Log.d("deleteBook", record.toString());

    }

1 个答案:

答案 0 :(得分:3)

SQLiteHelper需要一个Context变量作为参数的构造函数。

你应该致电:

MySQLiteHelper database = new MySQLiteHelper(context);
你可以从你的活动,服务,广播接收器获得的

Context context变量......或直接从Application类继承(你应该记得在清单文件中声明这个类)。

例如:

MySQLiteHelper database = new MySQLitehelper(activity.getApplicationContext());

另请注意,您应使用Application Context而不是Activity context。要查看差异,您会看到以下链接:Application Context vs Activity Context

希望这有帮助:)