Как я могу добавить документы Couchbase в список?

Я экспериментирую с Couchbase + Xamarin.Forms, пытаясь выполнить простой поиск, показывая результаты в ListView, но я застрял. :( Кто-то знает, как добавить строки/документы запроса в список?

public List<Visitor> SearchRecord (string word)
{
   var viewByName = db.GetView ("ByName");
   viewByName.SetMap((doc, emit) => {
     emit (new object[] {doc["first_name"], doc["last_name"]}, doc);
   }, "2");

   var visitorQuery = viewByName.CreateQuery();

   visitorQuery.StartKey = new List<object> {word};
   // visitorQuery.EndKey = new List<object> {word, new Dictionary<string, object>()};
   visitorQuery.Limit = 100;

   var visitors = visitorQuery.Run();
   var visitorList = new List<Visitor> ();

   foreach (var visitor in visitors) {
     // visitorList.Add(visitor.Document); <-- Error.
     System.Console.WriteLine(visitor.Key);
   }

   return visitorList;
}

Я получаю сообщения об ошибках:

Ошибка CS1501: нет перегрузки для аргументов метода Add' takes2 (CS1501) (Demo_Couchbase.Droid).

Заранее благодарим вас за любую помощь, которую вы можете предоставить.


person Jonathan Zúñiga    schedule 10.04.2015    source источник


Ответы (2)


Проблема в вашей картографической части. Вы можете напрямую транслировать документы на GetView. Вы можете попробовать следующий код.

 public List<Visitor> SearchRecord (string word)
{
   var viewByName = db.GetView<Visitor>("ByName","ByName");
   var visitorQuery = viewByName.CreateQuery();
   visitorQuery.StartKey = new List<object> {word};
   visitorQuery.Limit = 100;
   var visitors = visitorQuery.Run();
   var visitorList = new List<Visitor> ();

   foreach (var visitor in visitors) {
     visitorList.Add(visitor.Document); 
     System.Console.WriteLine(visitor.Key);
   }
   return visitorList;
}
person Sudharshan    schedule 10.04.2015
comment
Это выдает мне ошибку: Ошибка CS0308: необщий метод Couchbase.Lite.Database.GetView(string) нельзя использовать с аргументами типа (CS0308) (Demo_Couchbase.Droid) - person Jonathan Zúñiga; 10.04.2015
comment
@JonathanZúñiga, var viewByName = db.GetView‹Visitor›(ByName,ByName); Вам нужно передать два аргумента - person Sudharshan; 16.04.2015
comment
Привет, с двумя аргументами это дает мне эту ошибку: нет перегрузки для аргументов метода GetView' takes 2 (CS1501). Спасибо, Судхаршан, но я решил свою проблему и опубликую, что я сделал. - person Jonathan Zúñiga; 12.05.2015

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

Visitor ToRecord(Document d) {
    var props = d.Properties;

    return new Visitor {
        Id = props["_id"].ToString(),
        FirstName = (string)props["first_name"],
        LastName = (string)props["last_name"],
        Occupation = (string)props["occupation"],
        Company = (string)props["company"],
        Email = (string)props["email"],
        Phone = (string)props["phone"],
        Birthday = (string)props["birthday"],
        LastVisit = (string)props["last_visit"],
        LocalImagePath = (string)props["local_image_path"],
        Type = (string)props["type"],
        CreatedAt = (string)props["created_at"],
        UpdatedAt = (string)props["updated_at"],
        DeletedAt = (string)props["deleted_at"]
    };
}

public List<Visitor> SearchRecord (string word)
{
    var viewByName = db.GetView ("ByName");

    viewByName.SetMap((doc, emit) => {
        if ((doc.ContainsKey("type") && doc["type"].ToString() == "visitor") && (doc.ContainsKey("deleted_at") && doc["deleted_at"] == null))
                emit (new [] {doc["first_name"], doc["last_name"]}, doc);
    }, "2");

    var visitorQuery = viewByName.CreateQuery();

    visitorQuery.StartKey = word;
    visitorQuery.Limit = 50;

    var rows = visitorQuery.Run();
    var visitorList = new List<Visitor> ();

    for (int i = 0; i < rows.Count (); i++) {
        var row = rows.GetRow (i);
        var name = row.Document.GetProperty ("first_name").ToString ().ToLower () + " " + row.Document.GetProperty ("last_name").ToString ().ToLower ();

        if (name.Contains (word))
            visitorList.Add(ToRecord(row.Document));
    }

    return visitorList;
}
person Jonathan Zúñiga    schedule 12.05.2015
comment
Добро пожаловать в StackOverflow! При публикации ответа, пожалуйста, включите больше, чем просто фрагмент кода - укажите, в чем заключалось решение, чтобы другие тоже могли извлечь выгоду из вашего решения. - person dimo414; 12.05.2015