names.add(cursor.getString(i));
"i" er ikke markørens rækkeindeks, det er kolonneindekset. En markør er allerede placeret i en bestemt række. Hvis du har brug for at flytte markøren. Brug cursor.move eller moveToXXXX (se dokumentationen).
For getString/Int/Long osv. skal du blot fortælle markøren hvilken kolonne du ønsker. Hvis du ikke kender columnIndex, kan du bruge cursor.getColumnIndex("yourColumnName")
.
Din loop skal se sådan ud:
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()]);
}