Исключение нулевого указателя при попытке извлечь все документы из базы данных CouchDB с помощью ektorp на Android - PullRequest
0 голосов
/ 15 декабря 2011

У меня есть простая модель товара с именем и количеством:

public class Item  extends CouchDbDocument{
private static final long serialVersionUID = -3645214415410443346L;
private String name;
private int quantity;

public Item (String name, int qty){
    this.name = name;
    this.quantity = qty;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getQuantity() {
    return quantity;
}
public void setQuantity(int quantity) {
    this.quantity = quantity;
}
}

и класс репозитория предметов

public class ItemRepository extends CouchDbRepositorySupport<Item>{

public ItemRepository(CouchDbConnector db) {
        super(Item.class, db);
        initStandardDesignDocument();
}
@GenerateView @Override
public List<Item> getAll() {
    ViewQuery q = createQuery("all").descending(true);
    return db.queryView(q, Item.class);
}

и контроллер предметов

public class ItemController {
ItemRepository itemRepository;

public String viewAll() {
    List<Item> items = itemRepository.getAll();        
    return items.toString();
}
}

У меня есть класс CouchDBConnector, который добавлен как интерфейс javascript:

public class CouchDBConnector {
private WebView webView;
private DroidGap droidGap;
private CouchDbConnector db ;
private CouchDbInstance dbInstance;
private ItemController itemController;
private ItemRepository repo;

public CouchDBConnector(DroidGap gap, WebView view) {
    this.webView = view;
    this.droidGap = gap;
}

public void init(){
    HttpClient httpClient = new StdHttpClient.Builder()
            .host("localhost")
            .port(5984)
            .build();

    dbInstance = new StdCouchDbInstance(httpClient);
    db = new StdCouchDbConnector("itemdatabase", dbInstance);
    repo = new ItemRepository(db);
    itemController = new ItemController();
}

public String getAllItems(){
    String prefix = "Items \n";

    return prefix + repo.getAll().toString();
}

public void add(String item_name, String qty){
    repo.add(new Item(item_name, Integer.parseInt(qty)));
    return;
}
public void update(String item_name, String qty){
    repo.update(new Item(item_name, Integer.parseInt(qty)));
    return;
}
public void delete(String item_name, String qty){
    repo.remove(new Item(item_name, Integer.parseInt(qty)));
    return;
}
}

На странице HTML приложения PhoneGap я пытаюсь вызвать класс CouchDBConnector, чтобы получить все документы или строку «Элементы не найдены», но я получаю исключения нулевого указателя. Вот трассировка стека:

`12-14 16:12:45.273: I/dalvikvm(675): java.lang.NullPointerException:
12-14 16:12:45.273: I/dalvikvm(675):    at com.phonegap.TestDB.CouchDBConnector.getAllItems(CouchDBConnector.java:44)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:115)
12-14 16:12:45.273: I/dalvikvm(675):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-14 16:12:45.273: I/dalvikvm(675):    at android.os.Looper.loop(Looper.java:137)
12-14 16:12:45.273: I/dalvikvm(675):    at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:722)
12-14 16:12:45.283: I/dalvikvm(675):    at java.lang.Thread.run(Thread.java:856)
12-14 16:12:45.293: I/dalvikvm(675): "WebViewCoreThread" prio=5 tid=11 NATIVE
12-14 16:12:45.303: I/dalvikvm(675):   | group="main" sCount=0 dsCount=0 obj=0x41381ca0 self=0x1dbf90
12-14 16:12:45.303: I/dalvikvm(675):   | sysTid=688 nice=0 sched=0/0 cgrp=default handle=1748120
12-14 16:12:45.312: I/dalvikvm(675):   | schedstat=( 3460347960 1824920390 1206 ) utm=321 stm=24 core=0
12-14 16:12:45.312: I/dalvikvm(675):   at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.312: I/dalvikvm(675):   at android.webkit.JWebCoreJavaBridge.nativeServiceFuncPtrQueue(Native Method)
12-14 16:12:45.323: I/dalvikvm(675):   at android.webkit.JWebCoreJavaBridge.handleMessage(JWebCoreJavaBridge.java:115)
12-14 16:12:45.323: I/dalvikvm(675):   at android.os.Handler.dispatchMessage(Handler.java:99)
12-14 16:12:45.323: I/dalvikvm(675):   at android.os.Looper.loop(Looper.java:137)
12-14 16:12:45.333: I/dalvikvm(675):   at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:722)
12-14 16:12:45.343: I/dalvikvm(675):   at java.lang.Thread.run(Thread.java:856)

1 Ответ

2 голосов
/ 15 декабря 2011

Похоже, вы забыли вызвать init() от своего конструктора, потому что NPE находится в getAllItems(), поэтому eiter repo равен null или repo.getAll() равен.

...