2016-08-08 3 views
0

Я хочу извлечь данные из адаптера Array и сохранить его в базе данных , как если бы информация о сканированном bluetooth хранилась в массиве, и я хочу получить эти данные и сохранить их в своей базе данных. . любая помощь будет apreciatedКак извлечь данные из ArrayAdapter

+1

см. 'Адаптер # getItem' – pskink

+0

может убрать его надлежащим образом? –

+1

что разработать? он получает элемент из данной позиции: '" "" Получить элемент данных, связанный с указанной позицией в наборе данных. "" " – pskink

ответ

1

вы можете добавить в свой класс адаптера он будет возвращать все элементы адаптера в списке, вы можете делать все, что вы хотите с ним EDIT:

public class MainActivity extends Activity { 
    MyAdapter<String> btArrayAdapter; //don't foget to change type here 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ... 
     btArrayAdapter = new MyAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1); 
     listDevicesFound.setAdapter(btArrayAdapter); 
     ... 
    } 


    public class MyAdapter<String> extends ArrayAdapter<String> { 
     public MyAdapter(Context context, int resource) { 
      super(context, resource); 
     } 

     //Adapter implementation 
     //so this is the function that retieve data from the adapter 
     public List<String> getAllItems() { 
      ArrayList<String> result = new ArrayList<>() 
      for (int i = 0; i < getCount(); i++) { 
       result.add(getItem(i)); 
      } 
      return result; 
     } 
    } 
} 

вы можете затем извлекать данные по телефону btArrayAdapter.getAllItems();

для кнопки на XML:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/button" 
    android:onClick="btnClick" 
    android:text="save "/> 

для базы данных вы можете добавить:

public class MainActivity extends Activity { 

     //constant used for database 
     private static final String DEVICE = "Device"; 
     private static final String BLUETOOTH_DEVICES = "BluetoothDevice"; 
     private static final String DATE = "date"; 

     SQLiteDatabase myDatabase; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     //how to create or open databse 
     myDatabase = openOrCreateDatabase("DATABASE",MODE_PRIVATE,null); 

      // here we create a table like following 
      // BluetoothDevice : 
      // | Device : VARCHAR | 
      // | date : INTEGER | 

     myDatabase.execSQL("CREATE TABLE IF NOT EXISTS " + BLUETOOTH_DEVICES + "(" + DEVICE + " VARCHAR," + DATE + " INTEGER);"); 

    } 

    private Map<String, Date> getItemFromDatabase() { 
     Map<String,Date> result = new HashMap<>(); 
     //Query to retrieve data from database 
     Cursor c = myDatabase.rawQuery("Select * from " + BLUETOOTH_DEVICES, null); 
     //how to iterate hover database cursor 
     while (c.moveToNext()){ 
      result.put(c.getString(c.getColumnIndex(DEVICE)),new Date(c.getInt(c.getColumnIndex(DATE)))); 
     } 
     c.close(); 
     return result; 
    } 



    public void store(List<String> data){ 

     for (String value : data) { 
      //Query to insert item in databse 
      myDatabase.rawQuery("INSERT INTO "+BLUETOOTH_DEVICES+" VALUES(?,?);",new String[]{value, String.valueOf(new Date().getTime())}); 
     } 
    } 

    //button click listenner defined in xml 
    public void btnClick(View view) { 
     // here we store all adapter item in database 
     store(btArrayAdapter.getAllItems()); 
    } 
} 

Вы можете добавить его к предыдущему коду. Это просто база я высокоочищенного sugest вам переформатировать вы закодировать создать diffrent класс Java, использовать SQL помощника данных класс и прочее

+0

проверьте мой код и, пожалуйста, скажите мне, где его тоже добавить –

+0

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

+0

Я добавил создание кнопки и прослушиватель для нажатия кнопки и ОЧЕНЬ ПРОСТОГО создания базы данных, это база данных, но она должна работать. надеюсь, что это помогает –

0
FATAL EXCEPTION: main 
Process: com.example.test.test, PID: 17458 
java.lang.IllegalStateException: Could not execute method of the activity 
    at android.view.View$1.onClick(View.java:3989) 
    at android.view.View.performClick(View.java:4741) 
    at android.view.View$PerformClick.run(View.java:19384) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:146) 
    at android.app.ActivityThread.main(ActivityThread.java:5679) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at android.view.View$1.onClick(View.java:3984) 
    at android.view.View.performClick(View.java:4741)  
    at android.view.View$PerformClick.run(View.java:19384)  
    at android.os.Handler.handleCallback(Handler.java:733)  
    at android.os.Handler.dispatchMessage(Handler.java:95)  
    at android.os.Looper.loop(Looper.java:146)  
    at android.app.ActivityThread.main(ActivityThread.java:5679)  
    at java.lang.reflect.Method.invokeNative(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:515)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)  
    at dalvik.system.NativeStart.main(Native Method)  
Caused by: android.database.sqlite.SQLiteException: near "s": syntax error (code 1): , while compiling: INSERT INTO BluetoothDevice VALUES('Faiz's iPhone 
28:ED:6A:E0:E4:C8','1470825437206'); 
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1113) 
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:690) 
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59) 
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
    at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1793) 
+0

Я отредактировал свой ответ, чтобы включить его в ваш код –

+0

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

+0

его хорошо спасибо soo much –

0

Ok, как вы просили я создал acticity с 2 списка, на первом мы имеем список элементов. Под кнопкой «Сохранить», когда вы нажимаете на нее, есть кнопка с надписью «Сохранить», она получит весь элемент адаптера и сохранит их в базе данных. Внизу обновляется кнопка, которая будет извлекать базу данных данных drom и отображать их во втором списке.

так для XML мы имеем: activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:gravity="center" 
    android:layout_width="match_parent"> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:id="@+id/list" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:id="@+id/button" 
     android:onClick="btnSaveClick" 
     android:text="Save" /> 

    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="2" 
     android:id="@+id/dbList" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:id="@+id/refresh" 
     android:onClick="btnRefreshClick" 
     android:text="refresh" /> 

</LinearLayout> 

Тогда есть 3 классов Java, один для определения устройств Bluetooth объекта один для адаптера и один для деятельности. первая BluetoothDevice.java:

public class BluetoothDevice { 
    public String name; 
    public String address; 
    public Date date; 
    public String scan; 

    public BluetoothDevice(String name, String address, Date date,String scan) { 
     this.name = name; 
     this.address = address; 
     this.date = date; 
     this.scan =scan; 
    } 

    private SimpleDateFormat format = new SimpleDateFormat("dd MMMM yyyy"); 

    public String getDateFormatted() { 
     if (date == null){ 
      return " no date "; 
     } 
     return format.format(date); 
    } 
} 

Второй MyAdapter.java:

public class MyAdapter extends ArrayAdapter<BluetoothDevice> { 


    public MyAdapter(Context context, int resource, List<BluetoothDevice> devices) { 
     super(context, resource, devices); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // here we can define custom design of list item 
     TextView textView = new TextView(getContext()); 
     BluetoothDevice item = getItem(position); 
     textView.setTextColor(Color.BLACK); 
     textView.setText(item.name+" : "+item.address +" date :"+item.getDateFormatted()+" "+item.scan); 
     return textView; 
    } 


    //method to get all adapter objects 
    public List<BluetoothDevice> getAllItem() { 

     List<BluetoothDevice> result = new ArrayList<>(); 
     for (int i = 0; i < getCount(); i++) { 
      Log.e("fef", "getAllItem: "); 
      result.add(getItem(i)); 
     } 
     return result; 
    } 
} 

и, наконец MyActivity.java

public class MainActivity extends Activity { 


    SQLiteDatabase myDatabase; 

    private MyAdapter adapter; 

    private ListView listOfDatabaseObject; 

    private ListView list; 

    private String databaseName = "DATABASENAME2"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     list = (ListView) findViewById(R.id.list); 

     listOfDatabaseObject = (ListView) findViewById(R.id.dbList); 


     List<BluetoothDevice> devices = new ArrayList<>(); 

     //for the exemple i crate a new device to add to the list 
     devices.add(new BluetoothDevice("device 1", "14:5E:FE:AA", null,"scan record : 78984f9s8d4f98 s4df98s4f 984sf 984sd9f8 4cucoucou 7f578sfd57f8")); 


     adapter = new MyAdapter(getApplicationContext(), 0, devices); 
     list.setAdapter(adapter); 

     myDatabase = openOrCreateDatabase(databaseName, MODE_PRIVATE, null); 
     // here we create a table like following 
     // BluetoothDevice : 
     // | Device : VARCHAR | 
     // | Address : VARCHAR | 
     // | date : VARCHAR | 
     // | Scan : VARCHAR | 
     myDatabase.execSQL("CREATE TABLE IF NOT EXISTS BluetoothDevice (Device VARCHAR , Address VARCHAR , Date VARCHAR ,Scan VARCHAR);"); 


    } 

    private List<BluetoothDevice> getItemFromDatabase() { 
     List<BluetoothDevice> result = new ArrayList<>(); 
     // query database elements 
     Cursor c = myDatabase.rawQuery("Select * from BluetoothDevice ;", null); 

     while (c.moveToNext()) { 
      Date v = new Date(); 
      v.setTime(c.getInt(c.getColumnIndex("Date")) * 1000); 
      Date date = new Date(); 
      date.setTime(Long.valueOf(c.getString(c.getColumnIndex("Date")))); 
      result.add(
        new BluetoothDevice(
          c.getString(c.getColumnIndex("Device")), 
          c.getString(c.getColumnIndex("Address")), 
          date, 
          c.getString(c.getColumnIndex("Scan")) 
        ) 
      ); 
     } 
     c.close(); 
     return result; 
    } 


    public void store(List<BluetoothDevice> data) { 
     for (BluetoothDevice value : data) { 
      String s = String.valueOf(new Date().getTime()); 
      //insert in database 
      myDatabase.execSQL("INSERT INTO BluetoothDevice VALUES(?,?,?,?);", new String[]{value.name, value.address, s,value.scan}); 

     } 
    } 

    // save button click listener 
    public void btnSaveClick(View view) { 
     store(adapter.getAllItem()); 
    } 

    // refresh button click listener 
    public void btnRefreshClick(View view) { 
     List<BluetoothDevice> itemFromDatabase = getItemFromDatabase(); 
     MyAdapter adapter = new MyAdapter(getApplicationContext(), 0, itemFromDatabase); 
     listOfDatabaseObject.setAdapter(adapter); 
     adapter.notifyDataSetChanged(); 
    } 
} 

в этом коде вы найдете все, что нужно, чтобы получить все элемент из адаптера, создайте кнопку и ее действие, создайте простую базу данных sqlite с настраиваемым полем, вставить элемент из базы данных, получить из базы данных объект и окончательно отобразить их внутри списка.

+0

Myadapter btArrayAdapter; должен ли я изменить это слишком Адаптер Array, это бросает ошибку –

+0

, когда я нажимаю save, бросая ошибку, я отправил ошибку logcat –

+0

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

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