如何使用SQLite数据库信息使用下一个按钮单击填充ListView

时间:2015-12-15 15:05:42

标签: java android sqlite listview

我正在构建一个应用程序,每当我点击" next"时,就会从SQLite数据库中用一个随机记录填充ListView。猜谜式游戏的按钮。目前我可以在应用程序打开时从数据库中提取随机记录,但是,我不知道我是否需要新的课程,而且我不知道在哪里放置代码" next"按钮,我也不知道代码应该是什么。我每次有人点击按下" next"的按钮时,我基本上都试图让应用程序用DB中的新单个随机记录刷新ListView。我已经完成了xml布局,应用程序打开并完美显示第一个随机记录。感谢您的任何帮助! :)

MainActivity类:

package com.example.derek.guessinggame;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.Menu;
import android.view.MenuInflater;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FragmentManager fragmentManager = getSupportFragmentManager();
        if (fragmentManager.findFragmentById(android.R.id.content) == null) {
             GuessListFragment guessListFragment = new GuessListFragment();
             fragmentManager.beginTransaction().add(android.R.id.content, guessListFragment).commit();



        }



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

ContentProvider类:

package com.example.derek.guessinggame;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.provider.BaseColumns;
import android.text.TextUtils;
import android.util.Log;

 public class GuessProvider extends ContentProvider {
    private GuessDatabase mOpenHelper;

    private static final String TAG = GuessProvider.class.getSimpleName();
    private static final UriMatcher sUriMatcher = buildUriMatcher();

    private static final int GUESS = 100;
    private static final int GUESS_ID = 101;
    private Uri uri;
    private String selection;
    private String[] selectionArgs;

    private static UriMatcher buildUriMatcher() {
        final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
        final String authority = GuessContract.CONTENT_AUTHORITY;
        matcher.addURI(authority, "guess", GUESS);
        matcher.addURI(authority, "guess/*", GUESS_ID);
        return matcher;
    }

    @Override
    public boolean onCreate() {
        mOpenHelper = new GuessDatabase(getContext());
        return true;
    }

    private void deleteDatabase() {
        mOpenHelper.close();
        GuessDatabase.deleteDatabase(getContext());
        mOpenHelper = new GuessDatabase(getContext());
    }


    @Override
    public String getType(Uri uri) {
        final int match = sUriMatcher.match(uri);
        switch (match) {
            case GUESS:
                return GuessContract.Guess.CONTENT_TYPE;
            case GUESS_ID:
                return GuessContract.Guess.CONTENT_ITEM_TYPE;
            default:
                throw new IllegalArgumentException("Unknown Uri: " + uri);
        }
     }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        final SQLiteDatabase db = mOpenHelper.getReadableDatabase();
        final int match = sUriMatcher.match(uri);

        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
        queryBuilder.setTables(GuessDatabase.Tables.GUESS);

        switch (match) {
            case GUESS:
                // do nothing
                break;
            case GUESS_ID:
                String id = GuessContract.Guess.getGuessId(uri);
                queryBuilder.appendWhere(BaseColumns._ID + "=" + id);
                break;
            default:
                throw new IllegalArgumentException("Unknown Uri: " + uri);
        }

        Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
        return cursor;
    }


    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.v(TAG, "insert(uri=" + uri + ", values=" + values.toString());
        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        final int match = sUriMatcher.match(uri);
        switch (match) {
            case GUESS:
                long recordId = db.insertOrThrow(GuessDatabase.Tables.GUESS, null, values);
                return GuessContract.Guess.buildGuessUri(String.valueOf(recordId));
            default:
                throw new IllegalArgumentException("Unknown Uri: " + uri);
         }
    }


    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.v(TAG, "update(uri=" + uri + ", values=" + values.toString());
        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        final int match = sUriMatcher.match(uri);

        String selectionCriteria = selection;
        switch (match) {
            case GUESS:
                // do nothing
                break;
            case GUESS_ID:
                String id = GuessContract.Guess.getGuessId(uri);
                selectionCriteria = BaseColumns._ID + "=" + id
                    + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ")" : "");
                break;

            default:
                throw new IllegalArgumentException("Unknown Uri: " + uri);
        }

        return db.update(GuessDatabase.Tables.GUESS, values, selectionCriteria, selectionArgs);
    }


    @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.v(TAG, "delete(uri=" + uri);

        if (uri.equals(GuessContract.BASE_CONTENT_URI)) {
        deleteDatabase();
            return 0;
        }

        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        final int match = sUriMatcher.match(uri);
        switch (match) {
            case GUESS_ID:
                String id = GuessContract.Guess.getGuessId(uri);
                String selectionCriteria = BaseColumns._ID + "=" + id
                    + (!TextUtils.isEmpty(selection) ? " AND (" + selection + ")" : "");
                return db.delete(GuessDatabase.Tables.GUESS, selectionCriteria, selectionArgs);

            default:
                throw new IllegalArgumentException("Unknown Uri: " + uri);
        }
    }
}

ListLoader类:

package com.example.derek.guessinggame;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.support.v4.content.AsyncTaskLoader;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;

public class GuessListLoader extends AsyncTaskLoader<List<Guess>> {
    private static final String LOG_TAG = GuessListLoader.class.getSimpleName();
    private List<Guess> mGuess;
    private ContentResolver mContentResolver;
    private Cursor mCursor;

    public GuessListLoader(Context context, Uri uri, ContentResolver contentResolver) {
        super(context);
        mContentResolver = contentResolver;
    }

    @Override
    public List<Guess> loadInBackground() {
        String[] projection = {BaseColumns._ID,
                GuessContract.GuessColumns.GUESS_TITLE,
                GuessContract.GuessColumns.GUESS_ANSWER,
                GuessContract.GuessColumns.GUESS_HINT1,
                GuessContract.GuessColumns.GUESS_HINT2,
                GuessContract.GuessColumns.GUESS_HINT3,
                GuessContract.GuessColumns.GUESS_HINT4,
                GuessContract.GuessColumns.GUESS_HINT5};
        List<Guess> entries = new ArrayList<Guess>();

        mCursor = mContentResolver.query(GuessContract.URI_TABLE, projection, null, null, " random()");
        if (mCursor != null) {
            if (mCursor.moveToFirst()) {
                do {
                    int _id = mCursor.getInt(mCursor.getColumnIndex(BaseColumns._ID));
                    String title = mCursor.getString(mCursor.getColumnIndex(GuessContract.GuessColumns.GUESS_TITLE));
                    String answer = mCursor.getString(mCursor.getColumnIndex(GuessContract.GuessColumns.GUESS_ANSWER));
                    String hint1 = mCursor.getString(mCursor.getColumnIndex(GuessContract.GuessColumns.GUESS_HINT1));
                    String hint2 = mCursor.getString(mCursor.getColumnIndex(GuessContract.GuessColumns.GUESS_HINT2));
                    String hint3 = mCursor.getString(mCursor.getColumnIndex(GuessContract.GuessColumns.GUESS_HINT3));
                    String hint4 = mCursor.getString(mCursor.getColumnIndex(GuessContract.GuessColumns.GUESS_HINT4));
                    String hint5 = mCursor.getString(mCursor.getColumnIndex(GuessContract.GuessColumns.GUESS_HINT5));
                    Guess guess = new Guess(_id, title, answer, hint1, hint2, hint3, hint4, hint5);
                    entries.add(guess);
                } while (mCursor.isLast());
            }
        }
        return entries;
    }

    @Override
    public void deliverResult(List<Guess> guess) {
        if (isReset()) {
            if (guess != null) {
                mCursor.close();
            }
        }
        List<Guess> oldGuessList = mGuess;
        if (mGuess == null || mGuess.size() == 0) {
            Log.d(LOG_TAG, "++++++++ No data returned");
        }
        mGuess = guess;
        if (isStarted()) {
            super.deliverResult(guess);
        }
        if (oldGuessList != null && oldGuessList != guess) {
            mCursor.close();
        }
    }

    @Override
    protected void onStartLoading() {
        if (mGuess != null) {
            deliverResult(mGuess);
        }
        if (takeContentChanged() || mGuess == null) {
            forceLoad();
        }
    }

    @Override
    protected void onStopLoading() {
        cancelLoad();
    }

    @Override
    protected void onReset() {
        onStopLoading();
        if (mCursor != null) {
            mCursor.close();
        }
        mGuess = null;
    }

    @Override
    public void onCanceled(List<Guess> guess) {
        super.onCanceled(guess);
        if (mCursor != null) {
            mCursor.close();
        }
    }

    @Override
    public void forceLoad() {
        super.forceLoad();
    }
}

ListFragment类:

package com.example.derek.guessinggame;

import android.content.ContentResolver;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;

import java.util.List;


public class GuessListFragment extends ListFragment
implements LoaderManager.LoaderCallbacks<List<Guess>> {

    private static final String LOG_TAG = GuessListFragment.class.getSimpleName();
    private GuessCustomAdapter mAdapter;
    private static final int LOADER_ID = 1;
    private ContentResolver mContentResolver;
    private List<Guess> mGuess;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setHasOptionsMenu(true);
        mContentResolver = getActivity().getContentResolver();
        mAdapter = new GuessCustomAdapter(getActivity(), getChildFragmentManager());
        setEmptyText("No entries");
        setListAdapter(mAdapter);
        setListShown(false);

        getLoaderManager().initLoader(LOADER_ID, null, this);
    }

    @Override
    public Loader<List<Guess>> onCreateLoader(int id, Bundle args) {
        mContentResolver = getActivity().getContentResolver();
        return new GuessListLoader(getActivity(), GuessContract.URI_TABLE, mContentResolver);
    }

    @Override
    public void onLoadFinished(Loader<List<Guess>> loader, List<Guess> guess) {
        mAdapter.setData(guess);
        mGuess = guess;
        if(isResumed()) {
            setListShown(true);
        } else {
            setListShownNoAnimation(true);
        }
    }

    @Override
    public void onLoaderReset(Loader<List<Guess>> loader) {
        mAdapter.setData(null);
    }
}

SQLiteOpenHelper类:

package com.example.derek.guessinggame;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.provider.BaseColumns;

public class GuessDatabase extends SQLiteOpenHelper {
    private static final String TAG = GuessDatabase.class.getSimpleName();
    private static final String DATABASE_NAME = "guess.db";
    private static final int DATABASE_VERSION = 2;
    private final Context mContext;

    interface Tables {
        String GUESS = "guess";
    }

    public GuessDatabase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        mContext = context;
    }


    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("CREATE TABLE " + Tables.GUESS + " ("
            + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
            + GuessContract.GuessColumns.GUESS_TITLE + " TEXT NOT NULL,"
            + GuessContract.GuessColumns.GUESS_ANSWER + " TEXT NOT NULL,"
            + GuessContract.GuessColumns.GUESS_HINT1 + " TEXT NOT NULL,"
            + GuessContract.GuessColumns.GUESS_HINT2 + " TEXT NOT NULL,"
            + GuessContract.GuessColumns.GUESS_HINT3 + " TEXT NOT NULL,"
            + GuessContract.GuessColumns.GUESS_HINT4 + " TEXT NOT NULL,"
            + GuessContract.GuessColumns.GUESS_HINT5 + " TEXT NOT NULL)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        int version = oldVersion;
        if (version == 1) {
            version = 2;
        }

        if (version != DATABASE_VERSION) {
            db.execSQL("DROP TABLE IF EXISTS " + Tables.GUESS);
            onCreate(db);
        }
    }

    public static void deleteDatabase(Context context) {
        context.deleteDatabase(DATABASE_NAME);
    }
}

ArrayAdapter类:

package com.example.derek.guessinggame;

import android.content.Context;
import android.support.v4.app.FragmentManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;

public class GuessCustomAdapter extends ArrayAdapter<Guess> {
    private LayoutInflater mLayoutInflater;
    private static FragmentManager sFragmentManager;

    public GuessCustomAdapter(Context context, FragmentManager fragmentManager) {
        super(context, android.R.layout.simple_expandable_list_item_2);
        mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        sFragmentManager = fragmentManager;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final View view;
        if (convertView == null) {
            view = mLayoutInflater.inflate(R.layout.custom_guess, parent, false);
        } else {
            view = convertView;
        }

        final Guess guess = getItem(position);
        final int _id = guess.getId();
        final String title = guess.getTitle();
        final String answer = guess.getAnswer();
        final String hint1 = guess.getHint1();
        final String hint2 = guess.getHint2();
        final String hint3 = guess.getHint3();
        final String hint4 = guess.getHint4();
        final String hint5 = guess.getHint5();

        ((TextView) view.findViewById(R.id.guess_title)).setText(title);
        ((TextView) view.findViewById(R.id.guess_answer)).setText(answer);
        ((TextView) view.findViewById(R.id.guess_hint1)).setText(hint1);
        ((TextView) view.findViewById(R.id.guess_hint2)).setText(hint2);
        ((TextView) view.findViewById(R.id.guess_hint3)).setText(hint3);
        ((TextView) view.findViewById(R.id.guess_hint4)).setText(hint4);
        ((TextView) view.findViewById(R.id.guess_hint5)).setText(hint5);

        return view;

    }

    public void setData(List<Guess> guesses) {
        clear();
        if (guesses != null) {
            for (Guess guess : guesses) {
                add(guess);
            }
        }
    }
}

合同类:

package com.example.derek.guessinggame;

import android.net.Uri;
import android.provider.BaseColumns;

public class GuessContract {
    interface GuessColumns{
        String GUESS_ID = "_id";
        String GUESS_TITLE = "guess_title";
        String GUESS_ANSWER = "guess_answer";
        String GUESS_HINT1 = "guess_hint1";
        String GUESS_HINT2 = "guess_hint2";
        String GUESS_HINT3 = "guess_hint3";
        String GUESS_HINT4 = "guess_hint4";
        String GUESS_HINT5 = "guess_hint5";
    }

    public static final String CONTENT_AUTHORITY = "com.example.derek.guessinggame.provider";
    public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);

    private static final String PATH_GUESS = "guess";
    public static final Uri URI_TABLE = Uri.parse(BASE_CONTENT_URI.toString() + "/" + PATH_GUESS);

    public static final String[] TOP_LEVEL_PATHS = {
            PATH_GUESS
    };

    public static class Guess implements GuessColumns, BaseColumns {
        public static final Uri CONTENT_URI =
            BASE_CONTENT_URI.buildUpon().appendEncodedPath(PATH_GUESS).build();

        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd." + CONTENT_AUTHORITY + ".guess";
        public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd." + CONTENT_AUTHORITY + ".guess";

        public static Uri buildGuessUri(String guessId) {
            return CONTENT_URI.buildUpon().appendEncodedPath(guessId).build();
        }

        public static String getGuessId(Uri uri) {
            return uri.getPathSegments().get(1);
        }
    }
}

Getters and Setter类:

package com.example.derek.guessinggame;

public class Guess {
    private int _id;
    private String title;
    private String answer;
    private String hint1;
    private String hint2;
    private String hint3;
    private String hint4;
    private String hint5;

    public Guess(int _id, String title, String answer, String hint1, String hint2, String hint3, String hint4, String hint5) {
        this._id = _id;
        this.title = title;
        this.answer = answer;
        this.hint1 = hint1;
        this.hint2 = hint2;
        this.hint3 = hint3;
        this.hint4 = hint4;
        this.hint5 = hint5;
    }

    public int getId() {
        return _id;
    }

    public void setId(int _id) {
        this._id = _id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAnswer() {
        return answer;
    }

    public void setAnswer(String answer) {
        this.answer = answer;
    }

    public String getHint1() {
        return hint1;
    }

    public void setHint1(String hint1) {
        this.hint1 = hint1;
    }

    public String getHint2() {
        return hint2;
    }

    public void setHint2(String hint2) {
        this.hint2 = hint2;
    }

    public String getHint3() {
        return hint3;
    }

    public void setHint3(String hint3) {
        this.hint3 = hint3;
    }

    public String getHint4() {
        return hint4;
    }

    public void setHint4(String hint4) {
        this.hint4 = hint4;
    }

    public String getHint5() {
        return hint5;
    }

    public void setHint5(String hint5) {
        this.hint5 = hint5;
    }
}

0 个答案:

没有答案