2016-01-17 2 views
0

Я пытаюсь получить данные из столбца ITEMS в моей базе данных, чтобы появиться в списке Items, когда вы нажимаете кнопку add. В момент нажатия кнопки add он просто сохраняет элемент в столбце базы данных. Я был бы признателен за ответ!База данных SQLite для listView?

Основной класс Java (New_Recipe)

public class New_Recipe extends AppCompatActivity { 

Button add,done,display; 
EditText Recipe_Name,Recipe_Item,Recipe_Steps; 
String search; 
WebView webView; 
DatabaseHelper databaseHelper; 
ListView Items; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_new__recipe); 
    databaseHelper = new DatabaseHelper(this); 
    setTitle("New Recipe"); 
    add = (Button) findViewById(R.id.button2); 
    done = (Button) findViewById(R.id.button); 
    Recipe_Name = (EditText) findViewById(R.id.editText); 
    Recipe_Item = (EditText) findViewById(R.id.editText2); 
    Recipe_Steps = (EditText) findViewById(R.id.editText3); 
    webView = (WebView) findViewById(R.id.webView); 
    display = (Button) findViewById(R.id.button3); 
    Items = (ListView) findViewById(R.id.listView); 
    AddData(); 
    viewAll(); 

} 

public void AddData() { 
    done.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
     boolean inserted = databaseHelper.insertData1(Recipe_Name.getText().toString(), 
        Recipe_Steps.getText().toString()); 
      if (inserted == true) 
       Log.d("Database", "Data successfully inserted!"); 
      else Log.d("Database","Data did not insert!"); 
     } 
    }); 
    add.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      boolean inserted = databaseHelper.insertData2(Recipe_Item.getText().toString()); 
      if (inserted == true) 
       Log.d("Database", "Data successfully inserted!"); 
     else Log.d("Database","Data did not insert!"); 
    } 
    }); 
} 
public void viewAll() { 
    display.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Cursor res = databaseHelper.getAllData(); 
      if (res.getCount() == 0) { 
       showMessage("Error","No Data found!"); 
       return; 
      } 
      StringBuffer stringBuffer = new StringBuffer(); 
      while (res.moveToNext()) { 
       stringBuffer.append("Names :"+res.getString(0)+"\n"); 
       stringBuffer.append("Items :"+res.getString(1)+"\n"); 
       stringBuffer.append("Steps :"+res.getString(2)+"\n\n"); 

      } 
      showMessage("Success!",stringBuffer.toString()); 
     } 
    }); 
} 
public void showMessage(String title,String message) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setCancelable(true); 
    builder.setTitle(title); 
    builder.setMessage(message); 
    builder.show(); 
} 

public void onSearch(View v) { 
    search = "Recipes"; 
    webView.loadUrl("https://www.google.com/search?q="+search); 
} 

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

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

Класс Java Database (DatabaseHelper)

public class DatabaseHelper extends SQLiteOpenHelper { 

public static final String DATABASE_NAME = "Recipes.db"; 
public static final String TABLE_NAME = " Recipe_Table"; 
public static final String COL1 = "NAME"; 
public static final String COL2 = "ITEMS"; 
public static final String COL3 = "STEPS"; 


public DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, 1); 
    Log.d("Database", "Database should be made!"); 
} 


    @Override 
    public void onCreate (SQLiteDatabase db){ 
     db.execSQL("create table " + TABLE_NAME + " (NAME TEXT PRIMARY KEY,ITEMS TEXT,STEPS TEXT)"); 
     Log.d("Database", "Database should be made!, Again"); 
    } 

    @Override 
    public void onUpgrade (SQLiteDatabase db,int oldVersion, int newVersion){ 
     db.execSQL("DROP TABLE IF EXISTS" + TABLE_NAME); 
     Log.d("Database", "Table exists"); 
     onCreate(db); 

    } 

    public boolean insertData1(String name,String steps) { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(COL1, name); 
     contentValues.put(COL3, steps); 

     long result = db.insert(TABLE_NAME,null,contentValues); 
     if (result == -1) 
      return false; 
     else 
      return true; 

    } 
public boolean insertData2(String items) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put(COL2, items); 

    long result = db.insert(TABLE_NAME,null,contentValues); 
    if (result == -1) 
     return false; 
    else 
     return true; 

} 
public Cursor getAllData() { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor res = db.rawQuery("select * from "+TABLE_NAME,null); 
    return res; 
} 
public Cursor getItemData() { 
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor res = db.rawQuery("select"+COL2+"from"+TABLE_NAME,null); 
    return res; 
} 
} 

ответ

1

Настоящим способом Android для этого было бы использование комбинации ContentProvider и CursorAdapter.

У Android уже есть способ взять Cursor из запроса и поместить данные в ListView: CursorAdapter класс. Вы просто переопределяете getView(), чтобы создать представление элемента для своего списка.

Вот что обычай ContentProvider получит вас: Когда вы создаете контент-провайдер URI и запрос его, чтобы получить Cursor, настроен, так что при вставке/удаления данных/обновления через ContentProvider используя этот URI , Cursor получит уведомление о том, что данные были изменены и будут повторно запрашивать данные. Когда этот Cursor был установлен на CursorAdapter, адаптер будет также видеть, что данные курсора изменены и вызывают notifyDataSetChanged().

Таким образом, чистый результат заключается в том, что при добавлении записи ваш ListView является автоматически обновлен с текущими данными.

Для ознакомления с поставщиками контента обратитесь к этой статье: Content Providers | Android Developers.

+0

Хороший ответ, я еще не пробовал, но теперь я буду :-) –

+0

'ContentProvider's может быть немного тяжеловесом для таких приложений, но у них есть другие приятные функции ; например, выполнение запросов от потока пользовательского интерфейса. Поэтому я думаю, что это стоит посмотреть. –

+0

Выполнение запросов из потока пользовательского интерфейса, в отличие от создания asynctask или чего-то подобного? Это то, что вы имели ввиду? –

0

Вам нужно создать адаптер, представление списка может рисовать свои данные из. Вы передадите данные из вашего звонка getAllData() на адаптер, который отобразит представление списка.

Если вы еще этого не сделали, вы можете создать собственный класс, который расширяет базовый адаптер, правильно реализует методы, а затем все, что вам нужно беспокоиться об этом.

Прежде всего, мне всегда нравится создавать класс, который может хранить мои данные, полученные из базы данных. Что-то простое, например:

public class ItemObject { 
    // Instance variables. 
    private String mName, mItem, mStep; 

    // Constructor. 
    public ItemObject(String name, String item, String step) { 
     mName = name; 
     mItem = item; 
     mStep = step; 
    } 

    // Create getters for each item. 
    public String getName() { /*...*/ } 
    public String getItem() { /*...*/ } 
    public String getStep() { /*...*/ } 
} 

Теперь у вас есть объект, который может хранить элементы, извлеченные из таблицы базы данных. В вашем цикле while после вызова getAllData() вы создаете свой ItemObject.

Например:

List<ItemObject> itemObjectList = new ArrayList<>(); 
while (res.moveToNext()) { 
    // Extract values from the cursor. 
    String name = res.getString(0); 
    String item = res.getString(1); 
    String step = res.getString(2); 

    // Create the ItemObject and add it to the list. 
    ItemObject item = new ItemObject(name, item, step); 

    // Add it to the list. 
    itemObjectList.add(item); 
} 

Теперь вы будете иметь список элементов, которые можно передать непосредственно в адаптере.

public class ItemsListAdapter extends BaseAdapter { 
    // Instance variables. 
    private Context mContext; 
    private List<ItemObject> mItemObjectList; 

    // Constructor. 
    public ItemsListAdapter(Context context, List<itemObjectList> itemObjectList) { 
     mContext = context; 
     mItemObjectList = itemObjectList; 
    } 

    @Override 
    public int getCount() { 
     return mItemObjectList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mItemObjectList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // Inflate your layout for each row here. I wont include list view 
     // optimization here, as you should look it up, its documentation 
     // is readily available. 
     LayoutInflater inflater = LayoutInflater.from(mContext); 

     // Inflate the layout. 
     View layout = inflater.inflate(R.layout.<your_list_view_row_layout>, null); 

     // Reference the views inside the layout that will display each value. (Name, Item, Step); 
     TextView nameView = (TextView) layout.findViewById(R.id.<your_text_view_id>); 
     // Do this for each view. 

     // Now retrieve your data from the array list. 
     ItemObject item = (ItemObject) getItem(position); 

     // Now you have your item and the 3 values associated with it. 
     // Set the values in the UI. 
     nameView.setText(item.getName()); 

     // Return the view. 
     return layout; 
    } 

    // Use this method to modify the data in the list view. 
    // It's an ArrayList so simply add or remove elements, clear it, etc. 
    public List<ItemObject> getAdapterList() { 
     return mItemObjectList; 
    } 
} 

Для обновления элементов в списке, вызовите getAdapterList() и изменять элементы в ArrayList, который возвращается. После изменения вы должны аннулировать список, вызвав notifyDataSetChanged() на самом адаптере.

Надеюсь, это указывает на то, что вы в правильном направлении.

+0

Спасибо за ответ и извините за поздний ответ. Теперь я получаю сообщение об ошибке в своем логарифме, говоря «E/ArrayAdapter: вы должны указать идентификатор ресурса для TextView». Я не совсем уверен, почему я использую текстовое представление, в первую очередь, я думал, что должен работать с listView ...: p – Eklassen

Смежные вопросы