user1443098
user1443098

Reputation: 7665

Android Tutorial Database Access

I'm trying to get the Android Tutorial examples for SQLite3 database access at http://developer.android.com/training/basics/data-storage/databases.html. I'm getting stuck on an error message that I can't understand:

The constructor FeedReaderDbHelper(Context) refers to the missing type Context

I don't get why the compiler complains that the type Context is missing or how to fix the error. The error is reported on the line mDbHelper = new FeedReaderDbHelper(c); of the first file. Here are the source files:

File 1: MainActivity.java

package com.example.sqlitetest;

import android.os.Bundle;
import android.database.sqlite.*;
import android.app.Activity;
import android.view.*;
import android.content.*;

public class MainActivity extends Activity {
    FeedReaderDbHelper mDbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        View v = findViewById(R.layout.activity_main);
        Context c = v.getContext();
        mDbHelper = new FeedReaderDbHelper(c);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

File 2: FeedReaderContract

package com.example.sqlitetest;

import android.provider.BaseColumns;
import android.database.sqlite.*;
import android.content.*;

public final class FeedReaderContract {
       // To prevent someone from accidentally instantiating the contract class,
    // give it an empty constructor.
    public FeedReaderContract() {}

    /* Inner class that defines the table contents */
    public static abstract class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_ENTRY_ID = "entryid";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_SUBTITLE = "subtitle";
//        ...
    }

    private static final String TEXT_TYPE = " TEXT";
    private static final String COMMA_SEP = ",";
    private static final String SQL_CREATE_ENTRIES =
        "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
        FeedEntry._ID + " INTEGER PRIMARY KEY," +
        FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
        FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
//        ... // Any other options for the CREATE command
        " )";

    private static final String SQL_DELETE_ENTRIES =
        "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

    public class FeedReaderDbHelper extends SQLiteOpenHelper {
        // If you change the database schema, you must increment the database version.
        public static final int DATABASE_VERSION = 1;
        public static final String DATABASE_NAME = "FeedReader.db";

        public FeedReaderDbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(SQL_CREATE_ENTRIES);
        }
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // This database is only a cache for online data, so its upgrade policy is
            // to simply to discard the data and start over
            db.execSQL(SQL_DELETE_ENTRIES);
            onCreate(db);
        }
        public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            onUpgrade(db, oldVersion, newVersion);
        }
    }
}

Upvotes: 1

Views: 3241

Answers (1)

Tarsem Singh
Tarsem Singh

Reputation: 14199

1. use mDbHelper = new FeedReaderDbHelper(this); or mDbHelper = new FeedReaderDbHelper(getApplicationContext());

so your onCreate() should be

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDbHelper = new FeedReaderDbHelper(this);
    }

2.

use extends SQLiteOpenHelper this in Main class instead of in subclass so change to public class FeedReaderContract extends SQLiteOpenHelper

and make constructor of FeedReaderContract and than pass context to constructor of FeedReaderContract

and also all other code/functionality of FeedReaderDbHelper move to FeedReaderContract

Upvotes: 1

Related Questions