2017-02-01 2 views
0

Я пытаюсь создать ListView, который получает данные из базы данных SQLite (ранее существующий файл db). ListView использует настраиваемую строку, которая является одним из аспектов, которые препятствуют мне; Как извлечь данные и затем назначить их TextView в пользовательской строке?Xamarin Android C#: заполнить ListView Custom Row с данными из базы данных SQLite

Я новичок в Xamarin, поэтому был бы очень признателен за любые рекомендации, которые вы можете дать мне по этому поводу, спасибо!

текущего диалогового окна Ошибка при запуске:

Java.Lang.ClassNotFoundException: Didn't find class  "md5c4f65b5cf99ab8e97737acf0f8ec7efd.DBHelper" on path: DexPathList[[zip file "/data/app/AppName.Droid-1/base.apk"],nativeLibraryDirectories=[/data/app/AppName.Droid-1/lib/arm, /system/fake-libs, /data/app/AppName.Droid-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]] 

'MainActivity':

public class EateriesActivity : Activity 
{ 
    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     Title = "Find An Eatery"; 
     SetContentView(Resource.Layout.Eateries); 


     DBHelper db = new DBHelper(); 
     db.CreateDatabase(); 
     db.CreateTable(); 

     var items = db.GetData(); 
     var listView = FindViewById<ListView>(Resource.Id.EateryList_ListView); 

     listView.Adapter = new ArrayAdapter<string>(this, Resource.Layout.Eatery_ListView_Row, items); 
    } 
} 

ListViewAdapter (это необходимо?):

class ListViewAdapter : BaseAdapter<Eatery> 
{ 
    private List<Eatery> myItems; 
    private Context myContext; 
    public ListViewAdapter(Context context, List<Eatery> items) 
    { 
     myItems = items; 
     myContext = context; 
    } 
    public override int Count 
    { 
     get { return myItems.Count; } 
    } 

    public override long GetItemId(int position) 
    { 
     return position; 
    } 

    public override Eatery this[int position] 
    { 
     get 
     { 
      return myItems[position]; 
     } 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     View row = convertView; 

     if (row == null) 
     { 
      row = LayoutInflater.From(myContext).Inflate(Resource.Layout.Eatery_ListView_Row, null, false); 
     } 

     TextView placeName = row.FindViewById<TextView>(Resource.Id.placeName); 
     placeName.Text = myItems[position].Name; 

     TextView placeTown = row.FindViewById<TextView>(Resource.Id.placeTown); 
     placeTown.Text = myItems[position].Town; 

     return row; 
    } 
} 

Eatery:

public class Eatery 
{ 
    [PrimaryKey] 
    public string ID { get; set; } 
    public string Image { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string Address1 { get; set; } 
    public string Town { get; set; } 
    public string PostCode { get; set; } 
    public string Cuisine { get; set; } 
} 

DBHelper:

public class DBHelper 
{ 
    private static string DB_PATH = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
    private static string DB_NAME = "EateryDB.db"; 

    public void CreateDatabase() 
    { 
     string dbPath = Path.Combine(DB_PATH, DB_NAME); 
     var db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), dbPath); 
    } 

    public void CreateTable() 
    { 
     string dbPath = Path.Combine(DB_PATH, DB_NAME); 
     var db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), dbPath); 
     db.CreateTable<Eatery>(); 
    } 

    public List<string> GetData() 
    { 
     string dbPath = Path.Combine(DB_PATH, DB_NAME); 
     var db = new SQLiteConnection(new SQLite.Net.Platform.XamarinAndroid.SQLitePlatformAndroid(), dbPath); 
     List<string> data = new List<string>(); 
     foreach (var item in db.Table<Eatery>()) 
     { 
      var place = item.Name.ToString(); item.Town.ToString(); 

      data.Add(place); 
     } 
     return data; 
    } 
+0

ли вы на самом деле с просьбой о подключении и получить данные из базы данных SQlite? –

+0

@ GraceFeng-MSFT Привет. На самом деле это не то, что у меня возникают проблемы с его более сложным методом назначения извлеченных данных в TextView в пользовательской строке ListView. Не могли бы вы опубликовать возможное решение моей проблемы выше, если это будет очевидно, пожалуйста, очень понравилась бы ваша помощь? Я обновил код в сообщении. Благодарю. –

ответ

0

Основываясь на ваших двух версий кода, я думаю, что вам нужно будет добавлять данные из базы данных в myItems.

Затем вы можете, например, такой код:

List<Eatery> data = new List<Eatery>(); 
foreach (var item in db.Table<Eatery>()) 
{ 
    var place = item.Name.ToString(); 
    var location = item.Location.ToString(); 
    var rating = item.Rating; 
    item.Town.ToString(); 
    data.Add(new Eatery() { PlaceName = place, PlaceLocation = location, PlaceRating = rating }); 
} 

И, наконец, добавить эти данные к адаптеру, как вы делали, когда вы жесткий код:

MyListViewAdapter adapter = new MyListViewAdapter(this, data); 
+0

Привет, спасибо за ваш ответ. Я добавил первый раздел кода к методу addData() в DBHelper, затем ссылку класса ListViewAdapter на EateryActivity. Есть ли еще что-нибудь? Я получаю ту же ошибку, что и в верхней части сообщения. –

+0

@ E.Coder, ваша ошибка говорит о том, что ваш класс 'DBHelper' не найден, он равен нулю, правильно ли вы его запустили? –

+0

Я инициировал его в Основной деятельности ... Делает ли то, что я сделал до сих пор, правильно, или вы бы предложили другой способ подключения к БД? –