【发布时间】:2018-04-28 17:58:46
【问题描述】:
专家请按照我的查询提出建议。 我正在尝试在 Android studio 中运行查询。
As is : Spinner 根据使用 Textwatcher 输入的 edittext X 值显示 X 值。
待:微调器应根据编辑文本中输入的 X 值显示 Y 值。
示例:如果我在 edittext 中输入值“6”,那么我的微调器应该显示值“数据结构”
数据库跟随
package com.bar.example.myapplication;
import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
class DBHelper extends SQLiteOpenHelper {
private Context mContext;
//TASK: DEFINE THE DATABASE VERSION AND NAME (DATABASE CONTAINS MULTIPLE TABLES)
static final String DATABASE_NAME = "OCC";
private static final int DATABASE_VERSION = 1;
//TASK: DEFINE THE FIELDS (COLUMN NAMES) FOR THE COURSES TABLE
public static final String COURSES_TABLE = "Courses";
public static final String COURSES_KEY_FIELD_ID = "_id";
public static final String FIELD_ALPHA = "alpha";
public static final String FIELD_NUMBER = "number";
public static final String FIELD_TITLE = "title";
//TASK: DEFINE THE FIELDS (COLUMN NAMES) FOR THE INSTRUCTORS TABLE
//TASK: DEFINE THE FIELDS (COLUMN NAMES) FOR THE OFFERINGS TABLE
private static final String OFFERINGS_TABLE = "Offerings";
private static final String OFFERINGS_KEY_FIELD_ID = "crn";
private static final String FIELD_SEMESTER_CODE = "semester_code";
public static final String FIELD_COURSE_ID = "course_id";
public DBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase database) {
String createQuery = "CREATE TABLE " + COURSES_TABLE + "(" +
COURSES_KEY_FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
FIELD_ALPHA + " TEXT, " +
FIELD_NUMBER + " TEXT, " +
FIELD_TITLE + " TEXT" + ")";
database.execSQL(createQuery);
createQuery = "CREATE TABLE " + OFFERINGS_TABLE + "(" +
OFFERINGS_KEY_FIELD_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
FIELD_SEMESTER_CODE + " INTEGER, " +
FIELD_COURSE_ID + " INTEGER, "
+
"FOREIGN KEY(" + FIELD_COURSE_ID + ") REFERENCES "
+
COURSES_TABLE + "(" + COURSES_KEY_FIELD_ID + ")" +
")";
database.execSQL(createQuery);
}
@Override
public void onUpgrade(SQLiteDatabase database,
int oldVersion,
int newVersion) {
database.execSQL("DROP TABLE IF EXISTS " + COURSES_TABLE);
database.execSQL("DROP TABLE IF EXISTS " + OFFERINGS_TABLE);
onCreate(database);
}
//********** COURSE TABLE OPERATIONS: ADD, GETALL, EDIT, DELETE
public void addCourse(Course course) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(FIELD_ALPHA, course.getAlpha());
values.put(FIELD_NUMBER, course.getNumber());
values.put(FIELD_TITLE, course.getTitle());
db.insert(COURSES_TABLE, null, values);
// CLOSE THE DATABASE CONNECTION
db.close();
}
public ArrayList < Course > getAllCourses() {
ArrayList < Course > coursesList = new ArrayList < > ();
SQLiteDatabase database = this.getReadableDatabase();
//Cursor cursor = database.rawQuery(queryList, null);
Cursor cursor = database.query(
COURSES_TABLE,
new String[] {
COURSES_KEY_FIELD_ID,
FIELD_ALPHA,
FIELD_NUMBER,
FIELD_TITLE
},
null,
null,
null, null, null, null);
//COLLECT EACH ROW IN THE TABLE
if (cursor.moveToFirst()) {
do {
Course course =
new Course(cursor.getInt(0),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3));
coursesList.add(course);
} while (cursor.moveToNext());
}
return coursesList;
}
public void deleteCourse(Course course) {
SQLiteDatabase db = this.getWritableDatabase();
// DELETE THE TABLE ROW
db.delete(COURSES_TABLE, COURSES_KEY_FIELD_ID + " = ?",
new String[] {
String.valueOf(course.getId())
});
db.close();
}
public void deleteAllCourses() {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(COURSES_TABLE, null, null);
db.close();
}
public void updateCourse(Course course) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(FIELD_ALPHA, course.getAlpha());
values.put(FIELD_NUMBER, course.getNumber());
values.put(FIELD_TITLE, course.getTitle());
db.update(COURSES_TABLE, values, COURSES_KEY_FIELD_ID + " = ?",
new String[] {
String.valueOf(course.getId())
});
db.close();
}
public Course getCourse(int id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(
COURSES_TABLE,
new String[] {
COURSES_KEY_FIELD_ID,
FIELD_ALPHA,
FIELD_NUMBER,
FIELD_TITLE
},
COURSES_KEY_FIELD_ID + "=?",
new String[] {
String.valueOf(id)
},
null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Course course = new Course(
cursor.getInt(0),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3));
db.close();
return course;
}
//********** OFFERING TABLE OPERATIONS: ADD, GETALL, EDIT, DELETE
public void addOffering(int crn, int semesterCode, int courseId) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(OFFERINGS_KEY_FIELD_ID, crn);
values.put(FIELD_SEMESTER_CODE, semesterCode);
values.put(FIELD_COURSE_ID, courseId);
db.insert(OFFERINGS_TABLE, null, values);
// CLOSE THE DATABASE CONNECTION
db.close();
}
public ArrayList < Offering > getAllOfferings() {
ArrayList < Offering > offeringsList = new ArrayList < > ();
SQLiteDatabase database = this.getReadableDatabase();
//Cursor cursor = database.rawQuery(queryList, null);
Cursor cursor = database.query(
OFFERINGS_TABLE,
new String[] {
OFFERINGS_KEY_FIELD_ID,
FIELD_SEMESTER_CODE,
FIELD_COURSE_ID
},
null,
null,
null, null, null, null);
//COLLECT EACH ROW IN THE TABLE
if (cursor.moveToFirst()) {
do {
Course course = getCourse(cursor.getInt(2));
//Instructor instructor = getInstructor(cursor.getInt(3));
Offering offering = new Offering(cursor.getInt(0),
cursor.getInt(1), course);
offeringsList.add(offering);
} while (cursor.moveToNext());
}
return offeringsList;
}
public void deleteOffering(Offering offering) {
SQLiteDatabase db = this.getWritableDatabase();
// DELETE THE TABLE ROW
db.delete(OFFERINGS_TABLE, OFFERINGS_KEY_FIELD_ID + " = ?",
new String[] {
String.valueOf(offering.getCRN())
});
db.close();
}
public void deleteAllOfferings() {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(OFFERINGS_TABLE, null, null);
db.close();
}
public void updateOffering(Offering offering) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(FIELD_SEMESTER_CODE, offering.getSemesterCode());
values.put(FIELD_COURSE_ID, offering.getCourse().getId());
db.update(OFFERINGS_TABLE, values, OFFERINGS_KEY_FIELD_ID + " = ?",
new String[] {
String.valueOf(offering.getCRN())
});
db.close();
}
public Offering getOffering(int crn) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(
OFFERINGS_TABLE,
new String[] {
OFFERINGS_KEY_FIELD_ID,
FIELD_SEMESTER_CODE,
FIELD_COURSE_ID
},
OFFERINGS_KEY_FIELD_ID + "=?",
new String[] {
String.valueOf(crn)
},
null, null, null, null);
if (cursor != null)
cursor.moveToFirst();
Course course = getCourse(cursor.getInt(2));
//Instructor instructor = getInstructor(cursor.getInt(3));
Offering offering = new Offering(cursor.getInt(0),
cursor.getInt(1), course);
db.close();
return offering;
}
public Cursor getAllLabelsAsCursor() {
String[] columns = new String[] {
"rowid AS _id, *"
}; // Need _id column for SimpleCursorAdapter
return this.getWritableDatabase().query(COURSES_TABLE, columns, null, null, null, null, null);
}
public boolean importCoursesFromCSV(String csvFileName) {
AssetManager manager = mContext.getAssets();
InputStream inStream;
try {
inStream = manager.open(csvFileName);
} catch (IOException e) {
e.printStackTrace();
return false;
}
BufferedReader buffer = new BufferedReader(new InputStreamReader(inStream));
String line;
try {
while ((line = buffer.readLine()) != null) {
String[] fields = line.split(",");
if (fields.length != 4) {
Log.d("OCC Course Finder", "Skipping Bad CSV Row: " + Arrays.toString(fields));
continue;
}
int id = Integer.parseInt(fields[0].trim());
String alpha = fields[1].trim();
String number = fields[2].trim();
String title = fields[3].trim();
addCourse(new Course(id, alpha, number, title));
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean importOfferingsFromCSV(String csvFileName) {
AssetManager am = mContext.getAssets();
InputStream inStream = null;
try {
inStream = am.open(csvFileName);
} catch (IOException e) {
e.printStackTrace();
}
BufferedReader buffer = new BufferedReader(new InputStreamReader(inStream));
String line;
try {
while ((line = buffer.readLine()) != null) {
String[] fields = line.split(",");
if (fields.length != 4) {
Log.d("OCC Course Finder", "Skipping Bad CSV Row: " + Arrays.toString(fields));
continue;
}
int crn = Integer.parseInt(fields[0].trim());
int semesterCode = Integer.parseInt(fields[1].trim());
int courseId = Integer.parseInt(fields[2].trim());
addOffering(crn, semesterCode, courseId);
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
}
主要活动。
package com.bar.example.myapplication;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import android.util.Log;
import java.util.ArrayList;
import java.util.List;
public class CourseSearchActivity extends AppCompatActivity {
private DBHelper db;
private List < Course > allCoursesList;
private List < Offering > allOfferingsList;
private List < Offering > filteredOfferingsList;
public Button reset;
private EditText courseTitleEditText;
private Spinner ok;
private ListView offeringsListView;
// private selectedInstructorName selectedInstructorName;
private InstructorSpinnerAdapter instructorSpinnerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_course_search);
deleteDatabase(DBHelper.DATABASE_NAME);
db = new DBHelper(this);
db.importCoursesFromCSV("courses.csv");
db.importOfferingsFromCSV("offerings.csv");
Button reset = (Button) findViewById(R.id.resetButton);
allOfferingsList = db.getAllOfferings();
filteredOfferingsList = new ArrayList < > (allOfferingsList);
allCoursesList = db.getAllCourses();
courseTitleEditText = (EditText) findViewById(R.id.courseTitleEditText);
courseTitleEditText.addTextChangedListener(courseTitleTextWatcher);
ok = (Spinner) findViewById(R.id.spinner1);
// offeringListAdapter = new OfferingListAdapter(this, R.layout.offering_list_item, filteredOfferingsList);
// ok.setAdapter(offeringListAdapter);
instructorSpinnerAdapter = new InstructorSpinnerAdapter(this, R.layout.offering_list_item, filteredOfferingsList);
ArrayAdapter < String > instructorSpinnerAdapter = new ArrayAdapter < String >
(this, android.R.layout.simple_spinner_item, getAllCourse());
ok.setAdapter(instructorSpinnerAdapter);
ok.setOnItemSelectedListener(instructorSpinnerListener);
}
private String[] getAllCourse1() {
String[] instructorNames = new String[allCoursesList.size() + 1];
instructorNames[0] = "[Select Course]";
for (int i = 1; i < instructorNames.length; i++) {
instructorNames[i] = allCoursesList.get(i - 1).getTitle();
}
return instructorNames;
}
private ArrayList < String > getAllCourse() {
ArrayList < String > instructorNames = new ArrayList < > ();
instructorNames.add("[Select Course]");
for (int i = 0; i < allCoursesList.size(); i++) {
instructorNames.add(allCoursesList.get(i).getTitle());
}
return instructorNames;
}
public TextWatcher courseTitleTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String input = charSequence.toString().toLowerCase();
ArrayAdapter adapter = (ArrayAdapter) ok.getAdapter();
adapter.clear();
if (input.equals("")) {
adapter.addAll(getAllCourse());
} else {
Course course;
for (int j = 0; j < allCoursesList.size(); j++) {
// If the course title starts with the user input,
// add it to the listAdapter
course = allCoursesList.get(j);
if (course.getTitle().toLowerCase().startsWith(input)) {
adapter.add(course.getTitle());
}
}
}
adapter.notifyDataSetChanged();
if (adapter.getCount() != 0) ok.setSelection(0);
}
@Override
public void afterTextChanged(Editable editable) {
}
};
public AdapterView.OnItemSelectedListener instructorSpinnerListener = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView << ? > adapterView, View view, int i, long l) {
String selectedInstructorName = adapterView.getItemAtPosition(i).toString();
if (selectedInstructorName.equals("[Select Instructor]")) {
instructorSpinnerAdapter.clear();
for (Offering offering: allOfferingsList)
instructorSpinnerAdapter.add(offering);
} else {
instructorSpinnerAdapter.clear();
}
}
@Override
public void onNothingSelected(AdapterView << ? > adapterView) {
adapterView.setSelection(0);
// Toast.makeText(getApplicationContext(), "Why?", Toast.LENGTH_SHORT).show();
}
};
}
Activity_course_search.xml
<< ? xml version = "1.0"
encoding = "utf-8" ? >
<
LinearLayout
xmlns: android = "http://schemas.android.com/apk/res/android"
xmlns: tools = "http://schemas.android.com/tools"
android: id = "@+id/activity_course_search"
android: layout_width = "match_parent"
android: layout_height = "match_parent"
android: orientation = "vertical"
android: paddingBottom = "@dimen/activity_vertical_margin"
android: paddingLeft = "@dimen/activity_horizontal_margin"
android: paddingRight = "@dimen/activity_horizontal_margin"
android: paddingTop = "@dimen/activity_vertical_margin"
tools: context = "com.bar.example.myapplication.CourseSearchActivity" >
<
LinearLayout
android: orientation = "horizontal"
android: layout_width = "match_parent"
android: layout_height = "wrap_content" >
<
TextView
android: text = "Filter By Instructor"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: id = "@+id/textView" /
>
<
Spinner
android: id = "@+id/instructorSpinner"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_weight = "1" / >
<
/LinearLayout>
<
LinearLayout
android: orientation = "horizontal"
android: layout_width = "match_parent"
android: layout_height = "wrap_content" >
<
TextView
android: text = "Filter By Course Title"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: id = "@+id/textView2" /
>
<
EditText
android: id = "@+id/courseTitleEditText"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: inputType = "textPersonName"
android: ems = "10" /
>
<
/LinearLayout>
<
LinearLayout
android: orientation = "horizontal"
android: layout_width = "match_parent"
android: layout_height = "wrap_content" >
<
Button
android: text = "@string/reset_button_text"
android: layout_width = "wrap_content"
android: layout_height = "wrap_content"
android: layout_weight = "1"
android: id = "@+id/resetButton" /
>
<
/LinearLayout>
<
ListView
android: id = "@+id/offeringsListView"
android: layout_width = "match_parent"
android: layout_height = "18dp" >
<
/ListView>
<
Spinner
android: id = "@+id/spinner1"
android: layout_width = "341dp"
android: layout_height = "93dp"
android: layout_weight = "1" / >
<
/LinearLayout>
offering_list_item.xml
<< ? xml version = "1.0"
encoding = "utf-8" ? >
<
LinearLayout xmlns : android = "http://schemas.android.com/apk/res/android"
android: layout_width = "match_parent"
android: layout_height = "wrap_content"
android: id = "@+id/offeringListLinearLayout" >
<
LinearLayout
android: orientation = "vertical"
android: layout_width = "match_parent"
android: layout_height = "match_parent" >
<
TextView
android: text = "TextView"
android: layout_width = "match_parent"
android: layout_height = "wrap_content"
android: textSize = "20sp"
android: id = "@+id/offeringListFullNameTextView" / >
<
/LinearLayout>
<
/LinearLayout>
要求 1:(工作正常)从数据库中选择微调器。
要求 2:工作但需要以另一种方式。使用 textwacher 基于 edittext 条目从数据库中显示微调器。我想要的是,如果输入“编号 A170,那么我的微调器应该显示数据库中的“标题”Java Programming 1
修改了 onTextChanged 代码。
public TextWatcher courseTitleTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
String input = charSequence.toString().toLowerCase();
ArrayAdapter adapter = (ArrayAdapter) ok.getAdapter();
adapter.clear();
if (input.equals("")) {
adapter.addAll(getAllCourse());
} else {
Course course;
for (int j = 0; j < CoursesList.size(); j++) {
// If the course title starts with the user input,
// add it to the listAdapter
// course = allCoursesList.get(j);
if (courseTitleEditText.getText().equals(CoursesList.get(j).get("number"))) {
//adapter.add(course.getTitle());
ok.setSelection(j);
}
}
}
// adapter.notifyDataSetChanged();
//if(adapter.getCount() != 0)
// ok.setSelection(i);
}
@Override
public void afterTextChanged(Editable editable) {
}
};
【问题讨论】:
-
我不完全理解您想要实现的目标,您的布局会是什么样子,我认为它不会像您共享的数据库表示。您是否会有一个分开的编辑文本和一个微调器,或者类似于自动完成文本视图的东西,它会根据您输入的内容为您提供建议。最后,您每次都会输入 id 吗?在那种情况下,为什么要使用微调器?
-
好吧,在阅读了更多之后,您想要实现的是
ACTV (autocompletetextview)。您输入一个值,在更改时查看您的列表,然后将匹配的课程添加到微调器。与 ACTV 的唯一区别(据我所知)是在您开始输入之前您不会得到任何结果,因为在您的视图中,当您不输入任何内容时,您的微调器将充满所有结果 -
我会将它作为评论发布,因为它不是您所要求的,但这里有一些教程可能会对您有所帮助 基本示例:journaldev.com/9574/… SQLite 示例:androidcode.ninja/… 如果这是您所期望的告诉我,我会把它作为答案,这样每个面临同样问题的人都可以直接看到它:)
-
@MatthieuMeunier 感谢您附上您的反馈详细信息...
-
我刚刚看到了您修改后的
onTextChanged,我认为在您删除EditText中的文本之前,您不会得到任何结果。因为当 changed text 为空时您会获得所有课程,但会直接调用回调或仅在输入后调用回调,我相信,因此如果您输入某些内容,您的文本将不再为空,因此不加载课程,但是如果您删除文本,它将为空,然后加载课程,从而可以完成您的课程。我建议在onCreate甚至onResume获得所有课程
标签: android sqlite android-spinner