如何在 android 中按顺序显示 sqlite 列表

How to show the list of sqlite by order in android

我创建了一个计算大学成绩的应用程序,我想添加一个选项来对数据库进行排序。

我的数据库是基于 sqlite 的,每次我需要显示用户添加的所有课程的列表时,我都会一一获取它们并添加列表数据适配器。 它总是按插入顺序显示课程,我现在想提供一个选项,将列表顺序更改为按 course/By 年及以上的名称..

我附上了activity的代码,DataListActivity:

package com.example.ido.grades;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

import java.util.Collections;

public class DataListActivity extends ActionBarActivity {
    ListView listView;
    SQLiteDatabase sqLiteDatabase;
    CourseDbHelper courseDbHelper;
    Cursor cursor;
    ListDataAdaptar listDataAdaptar;
    Spinner sortSpinner;
    ArrayAdapter<String> sortAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.update_course);
        hideActionBar();
        sortSpinner = (Spinner)findViewById(R.id.sortSpinner);
        String[] sortItems = new String[]{"Sort by","Course name","Year","Semester", "Grade", "Points"};
        sortAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, sortItems);
        sortSpinner.setAdapter(sortAdapter);
        listView = (ListView) findViewById(R.id.list_view);
        listDataAdaptar = new ListDataAdaptar(getApplicationContext(),R.layout.row_layout);
        listView.setAdapter(listDataAdaptar);
        registerForContextMenu(listView);
        courseDbHelper = new CourseDbHelper(getApplicationContext());

        sqLiteDatabase = courseDbHelper.getReadableDatabase();
        cursor = courseDbHelper.getInformation(sqLiteDatabase);
        registerForContextMenu(listView);
        View header = getLayoutInflater().inflate(R.layout.header, null);
        listView.addHeaderView(header);


        if (!cursor.moveToFirst()){
        }
        else {
            do {
                String year,semester,course,points,grade;
                year = cursor.getString(0);
                semester = cursor.getString(1);
                course = cursor.getString(2);
                points = cursor.getString(3);
                grade = cursor.getString(4);
                DataProvider dataProvider  = new DataProvider(year,semester,course,points,grade);
                listDataAdaptar.add(dataProvider);
            }
            while (cursor.moveToNext());
        }
    }
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflater = getMenuInflater();
        if (((AdapterView.AdapterContextMenuInfo)menuInfo).position == 0) {
            return;
        }
        inflater.inflate(R.menu.menu_data_list, menu);

    }
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info =
                (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

        final int mySelectedRowIndex = info.position-1;


            switch (item.getItemId()) {
                case R.id.update_item:
                    courseDbHelper = new CourseDbHelper(getApplicationContext());
                    sqLiteDatabase = courseDbHelper.getReadableDatabase();
                    DataProvider raw2 = (DataProvider) listDataAdaptar.getItem(mySelectedRowIndex);

                    Intent i = new Intent(DataListActivity.this, UpdateCourseActivity.class);
                    String year = raw2.getYear();
                    String semester = raw2.getSemester();
                    String course = raw2.getCourse();
                    String points = raw2.getPoints();
                    String grade = raw2.getGrade();
                    int semIndex;
                    if (semester.equals("A'")) {
                        semIndex = 1;
                    } else if (semester.equals("B'")) {
                        semIndex = 2;
                    } else {
                        semIndex = 3;
                    }
                    i.putExtra("YEAR", year);
                    i.putExtra("SEMESTER", Integer.toString(semIndex));
                    i.putExtra("COURSE", course);
                    i.putExtra("POINTS", points);
                    i.putExtra("GRADE", grade);
                    i.putExtra("POS", Integer.toString(mySelectedRowIndex));

                    startActivity(i);


                    return true;
                case R.id.delete_item:
                    AlertDialog.Builder builder1 = new AlertDialog.Builder(this);
                   DataProvider raw3 = (DataProvider) listDataAdaptar.getItem(mySelectedRowIndex);
                    builder1.setMessage("The course '" + raw3.getCourse() + "' Will delete, Are you sure?");
                    builder1.setCancelable(true);
                    builder1.setPositiveButton("Yes",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    delete(mySelectedRowIndex);
                                    dialog.cancel();
                                }
                            });
                    builder1.setNegativeButton("No",
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                                }
                            });

                    AlertDialog alert11 = builder1.create();
                    alert11.show();

                    return true;
                default:
                    return super.onOptionsItemSelected(item);
            }

        }

    public void onBackPressed() {
        startActivity(new Intent(this, MainActivity.class));
    }

    public void delete(int mySelectedRowIndex){
        courseDbHelper = new CourseDbHelper(getApplicationContext());
        sqLiteDatabase = courseDbHelper.getReadableDatabase();
        DataProvider raw = (DataProvider)listDataAdaptar.getItem(mySelectedRowIndex);
        courseDbHelper.deleteInformation(raw.getYear(), raw.getSemester(), raw.getCourse(), raw.getPoints(), raw.getGrade());
        Toast.makeText(this, "The course succesfully deleted", Toast.LENGTH_SHORT).show();
        finish();
        startActivity(getIntent());

    }
    private void hideActionBar() {
        //Hide the action bar only if it exists
        if (getSupportActionBar() != null) {
            getSupportActionBar().hide();
        }
    }
    }

CourseDBHelper.java:

package com.example.ido.grades;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class CourseDbHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME  = "COURSEINFO.DB";
    private static final int DATABASE_VERSION = 1;


    public String CREATE_QUERY = "CREATE TABLE " + UserCourse.NewCourseInfo.TABLE_NAME + "("+ UserCourse.NewCourseInfo.YEAR+" TEXT,"
            + UserCourse.NewCourseInfo.SEMESTER+" TEXT,"+ UserCourse.NewCourseInfo.COURSE+" TEXT,"+ UserCourse.NewCourseInfo.POINTS+" TEXT,"
            + UserCourse.NewCourseInfo.GRADE+" TEXT);";

    public  CourseDbHelper (Context context){

        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        Log.e("DATABASE_OPERATIONS","Database created/opened...");
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_QUERY);
        Log.e("DATABASE_OPERATIONS", "Table created");

    }
    public void putInformation(String year, String semester, String course, String points,String grade,SQLiteDatabase db){
        ContentValues cv = new ContentValues();
        cv.put(UserCourse.NewCourseInfo.YEAR, year);
        cv.put(UserCourse.NewCourseInfo.SEMESTER, semester);
        cv.put(UserCourse.NewCourseInfo.COURSE, course);
        cv.put(UserCourse.NewCourseInfo.POINTS,points);
        cv.put(UserCourse.NewCourseInfo.GRADE, grade);
        db.insert(UserCourse.NewCourseInfo.TABLE_NAME, null, cv);
        Log.e("DATABASE_OPERATIONS", "One raw inserted");

    }
    public double updateInformation(String old_course,String year, String semester, String course, String points,String grade,SQLiteDatabase db){
        ContentValues cv = new ContentValues();
        cv.put(UserCourse.NewCourseInfo.YEAR, year);
        cv.put(UserCourse.NewCourseInfo.SEMESTER, semester);
        cv.put(UserCourse.NewCourseInfo.COURSE, course);
        cv.put(UserCourse.NewCourseInfo.POINTS,points);
        cv.put(UserCourse.NewCourseInfo.GRADE, grade);
        String Selection = UserCourse.NewCourseInfo.COURSE + " LIKE ?";
        String[] Selection_args = {old_course};
       double count =  db.update(UserCourse.NewCourseInfo.TABLE_NAME,cv,Selection,Selection_args);
        return count;
    }
    public Cursor getInformation(SQLiteDatabase db){
        Cursor cursor;
        String[] projections = {UserCourse.NewCourseInfo.YEAR,UserCourse.NewCourseInfo.SEMESTER,
                UserCourse.NewCourseInfo.COURSE, UserCourse.NewCourseInfo.POINTS,UserCourse.NewCourseInfo.GRADE};
          cursor=     db.query(UserCourse.NewCourseInfo.TABLE_NAME,projections,null,null,null,null,null );
        return cursor;
    }
    public void deleteInformation(String  year, String semester,
                                  String course,String points,  String grade){
        SQLiteDatabase db = null;
        try
        {
            db = this.getWritableDatabase();

            String where = UserCourse.NewCourseInfo.YEAR + " = ? AND "
                    + UserCourse.NewCourseInfo.SEMESTER + " = ? AND "
                    + UserCourse.NewCourseInfo.COURSE + " = ? AND "
                    + UserCourse.NewCourseInfo.POINTS + " = ? AND "
                    + UserCourse.NewCourseInfo.GRADE + " = ?";

            double iNumberDeleted = db.delete(
                    UserCourse.NewCourseInfo.TABLE_NAME,
                    where,
                    new String[]{year, semester, course, points, grade}
            );
            // you might want to evaluate the number of affected rows
        }
        catch (Exception ex)
        {
            Log.d("DB_DELETE", "...your data..." + "\n" + ex.getMessage());

        }
        finally
        {
            if (db != null)
                db.close();
        }



    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}

DataProvider.java:

package com.example.ido.grades;

/**
 * Created by Ido on 08/08/2015.
 */
public class DataProvider {

    private String year;
    private String semester;

    public String getYear() {
        return year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getSemester() {
        return semester;
    }

    public void setSemester(String semester) {
        this.semester = semester;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }

    public String getPoints() {
        return points;
    }

    public void setPoints(String points) {
        this.points = points;
    }

    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    private String course;
    private String points;
    private String grade;

    public DataProvider(String year, String semester,String course, String points, String grade){
        this.year=year;
        this.semester=semester;
        this.course=course;
        this.points=points;
        this.grade=grade;
    }
    }

我希望它足以理解我想要什么。 谢谢!

我的新问题

当我尝试按成绩对 table 进行排序时遇到问题,例如,我的数据库的成绩为:50,26,6,100,89。 它将显示: 1. 89 2. 6 3. 50 4. 26 5. 100 代替: 1. 100 2. 89 3. 50 4. 26 5. 6

我需要以某种方式按整数而不是字符串排序,这就是查询的行代码:

cursor = db.query(UserCourse.NewCourseInfo.TABLE_NAME, projections, null, null, null, null, UserCourse.NewCourseInfo.GRADE +  " DESC");

您可以像下面这样更改查询以获取排序形式的数据

Cursor cursor = db.query(Your_table_name, new String[] {date, year,semester,course,points,grade},
    null, null, null, null, date + " ASC, " + semester  + " ASC");
  1. 这里new String[] {date, year,semester,course,points,grade}是你要数据读取的列数组。

  2. date + " ASC, " + semester + " ASC" -- 表示我们希望数据按日期和学期升序排序。您可以使用 DESC 而不是 ASC 来反向排序。

  3. 您可以使用 date + " ASC, " + semester + " ASC" 以相同的方式添加更多数据以获得额外的排序条件,例如 date + " ASC, " + semester + " ASC, ",+ point + " ASC"

注:

注意查询中的逗号、加号和空格

  public Cursor query(String table, String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,
            String orderBy) 

希望大家能看名字就明白。所以你需要为最后一个参数传递排序顺序。

因为您有带排序选择的微调器。只需将选定的排序库名传递给 getinformation method.just 通过下面的 Oncreate 方法

代码
sortSpinner = (Spinner)findViewById(R.id.sortSpinner);
        String[] sortItems = new String[]{"Sort by","Course name","Year","Semester", "Grade", "Points"};
        sortAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, sortItems);
        sortSpinner.setAdapter(sortAdapter);
        listView = (ListView) findViewById(R.id.list_view);
        listDataAdaptar = new ListDataAdaptar(getApplicationContext(),R.layout.row_layout);
        listView.setAdapter(listDataAdaptar);
        registerForContextMenu(listView);
        courseDbHelper = new CourseDbHelper(getApplicationContext());

        sqLiteDatabase = courseDbHelper.getReadableDatabase();
        cursor = courseDbHelper.getInformation(sqLiteDatabase,UserCourse.NewCourseInfo.COURSE)
     sortSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                     if(position==0){
                         cursor = courseDbHelper.getInformation(sqLiteDatabase,UserCourse.NewCourseInfo.COURSE);


                     }else if(position==1){
                         cursor = courseDbHelper.getInformation(sqLiteDatabase,UserCourse.NewCourseInfo.YEAR);

                     }}

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }
                });

只需将 SelectedSortOrder 传递给数据库助手的 getInformation 方法 class。

    public Cursor getInformation(SQLiteDatabase db, String SelectedSortOrder){
            Cursor cursor;

            String[] projections = {UserCourse.NewCourseInfo.YEAR,UserCourse.NewCourseInfo.SEMESTER,
                    UserCourse.NewCourseInfo.COURSE, UserCourse.NewCourseInfo.POINTS,UserCourse.NewCourseInfo.GRADE};
 if(SelectedSortOrder.equals(UserCourse.NewCourseInfo.COURSE)){
    cursor=  db.query(UserCourse.NewCourseInfo.TABLE_NAME,projections,null,null,null,null, UserCourse.NewCourseInfo.COURSE + " ASEC");
                return cursor;
            }

    else if(SelectedSortOrder.equals(UserCourse.NewCourseInfo.GRADE)){
cursor=     db.query(UserCourse.NewCourseInfo.TABLE_NAME,projections,null,null,null,null, UserCourse.NewCourseInfo.GRADE + " ASEC");
                return cursor;
    } elseif(AnotherTYPE){  }

或者通过原始查询,您也可以对数据库进行排序。您可以将 sortorder 替换为 ASEC 或 DESC

String orderBy ="select COLUMN_NAME from TABLE_NAME orderby ASEC ";
                 Cursor C=database_ob.rawQuery(orderBy, null);

已编辑:他的成绩分数新问题

 public String CREATE_QUERY = "CREATE TABLE " + UserCourse.NewCourseInfo.TABLE_NAME + "("+ UserCourse.NewCourseInfo.YEAR+" TEXT,"+ UserCourse.NewCourseInfo.SEMESTER+" TEXT,"+ UserCourse.NewCourseInfo.COURSE+" TEXT,"+ UserCourse.NewCourseInfo.POINTS+" TEXT,"+ UserCourse.NewCourseInfo.GRADE+" TEXT);";

您正在将 GRADE 存储为 TEXT。您需要使用 ORDERBY

排序方式 UserCourse.NewCourseInfo.GRADE 降序

cursor = db.query(UserCourse.NewCourseInfo.TABLE_NAME, projections, null, null, null, null, "ORDER BY "+UserCourse.NewCourseInfo.GRADE + " DESC");

整数 。您需要保存为整数类型数据。作为 int 传递。您可以将 String 转换为 int 为 Integer.parseInt("your value")

 int grade;
 public void setGrade(int grade) {
        this.grade = grade;
    }