简体   繁体   English

使用Sqlite将Edittext输入中的数据填充到Spinner Display

[英]Populating data from Edittext input to Spinner Display using Sqlite

Expert Please advise with following my query. 专家请按照我的查询提出建议。 I am trying to run the query in Android studio . 我试图在Android工作室中运行查询。

As is : Spinner shows the X value as per edittext X value input using Textwatcher. 原样:Spinner根据使用Textwatcher输入的edittext X值显示X值。

To be : Spinner should show the Y value as per X value input in Edit text. 要:Spinner应根据编辑文本中输入的X值显示Y值。

Example: If i enter value "6" in edittext then my spinner should show the vaue "Data Structures" 示例:如果我在edittext中输入值“6”,那么我的微调器应该显示vaue“数据结构”

My Database follows. 我的数据库如下。 在此输入图像描述

Database follows 数据库如下

 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; } } 

main activity. 主要活动。

 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 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 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> 

Main Screen 1 : 主屏幕1: 在此输入图像描述

Requirement 1 : (Working Fine) spinner selection from database. 要求1 :(工作正常)从数据库中选择微调器。

在此输入图像描述

Requirement 2 : Working but need in another way . 要求2:工作但需要另一种方式。 Spinner display from database based on edittext entry using textwacher. 使用textwacher基于edittext条目从数据库显示微调器。 What i want is that if enter "Number A170 then my spinner should show "title" Java Programming 1 from database 我想要的是,如果输入“数字A170然后我的微调器应该显示”标题“Java编程1从数据库

Current screen shows 当前屏幕显示 在此输入图像描述

I want it in this way ... 我想用这种方式...... 在此输入图像描述

revised onTextChanged code. 修改了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) { } }; 

Try this. 尝试这个。 It should solve your issue. 它应该解决你的问题。

Replace if (course.getTitle().toLowerCase().startsWith(input)) { 替换if (course.getTitle().toLowerCase().startsWith(input)) {

with if (course.getNumber().toLowerCase().startsWith(input)) { . with if (course.getNumber().toLowerCase().startsWith(input)) {

i think i figure what do you need 我想我想你需要什么

actully it's little simple im try to work it with your code but not by modeling way like you it will be by hashmap array 实际上它很简单我尝试使用你的代码,但不是通过像你一样的建模方式,它将通过hashmap数组

first we need to get the data from you sqlite by using this code 首先,我们需要使用此代码从您的sqlite获取数据

THIS in class DBHelper 这是DBHelper课程中的一部分

import java.util.HashMap;
import java.util.Map;

this the import you need here 这是你需要的导入

public ArrayList<Map<String, String>> getCourses()
{
    ArrayList<Map<String, String>> array_list = new ArrayList<>();

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery("select * from " + COURSES_TABLE, null);
    res.moveToFirst();

    while(res.isAfterLast() == false){
        Map<String, String> datanum = new HashMap<String, String>();
        datanum.put("id", res.getString(res.getColumnIndex(COURSES_KEY_FIELD_ID)));
        datanum.put("alpha", res.getString(res.getColumnIndex(FIELD_ALPHA)));
        datanum.put("number", res.getString(res.getColumnIndex(FIELD_NUMBER)));
        datanum.put("title", res.getString(res.getColumnIndex(FIELD_TITLE)));
        array_list.add(datanum);
        res.moveToNext();
    }
    return array_list;
}

this code here will work perfect with you not need to edit i make it with your class 这里的代码将完美地与你完成,你不需要编辑我的课程

now you need to call this method in you class 现在你需要在你的课堂上调用这个方法

THIS in class CourseSearchActivity 这课程在CourseSearchActivity中

DBHelper DB;
ArrayList<Map<String, String>> CoursesList = new ArrayList<Map<String, String>>();

on create 在创造

    DB = new DBHelper(this);
    CoursesList= DB.getCourses(); 

now you have all in your CoursesList now you need to figure out which spinner position you wanna to select it 现在你已经拥有了CoursesList中的所有内容,现在你需要弄清楚你想要选择哪个微调器位置

so 所以

you going to loop on it 你要循环它

THIS in Textlistener 这在Textlistener中

    for(int i = 0 ; i < CoursesList.size() ; i++){
        if(courseTitleEditText.getText().equals(CoursesList.get(i).get("number"))){//ex.A170
// you must to be filled your spinner from same courses db and here you gonna to set your selection by iteration
            ok.setSelection(i);
        } 
    }

maybe it's not the right thing to your code because i see you use modeling in your code and i use Hashmap but i think it's useful to see the same way in your modeling from this code i didn't test it i wrote it direct so test and told me what happen hope i help 也许这对你的代码来说不是正确的,因为我看到你在你的代码中使用建模而我使用Hashmap但是我认为从你的代码中看到相同的方式从这个代码我没有测试它我是直接编写它所以测试告诉我发生了什么事希望我能帮忙

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM