names.add(cursor.getString(i));
"i" není index řádku kurzoru, je to index sloupce. Kurzor je již umístěn na konkrétním řádku. Pokud potřebujete změnit polohu kurzoru. Použijte kurzor.move nebo moveToXXXX (viz dokumentace).
Pro getString/Int/Long atd. stačí kurzoru sdělit, který sloupec chcete. Pokud neznáte columnIndex, můžete použít cursor.getColumnIndex("yourColumnName")
.
Vaše smyčka by měla vypadat takto:
public String[] getContacts(){
Cursor cursor = getReadableDatabase().rawQuery("SELECT name FROM contacts", null);
cursor.moveToFirst();
ArrayList<String> names = new ArrayList<String>();
while(!cursor.isAfterLast()) {
names.add(cursor.getString(cursor.getColumnIndex("name")));
cursor.moveToNext();
}
cursor.close();
return names.toArray(new String[names.size()]);
}