names.add(cursor.getString(i));
"i" не е индексът на реда на курсора, а индексът на колоната. Курсорът вече е позициониран върху конкретен ред. Ако трябва да преместите курсора си. Използвайте cursor.move или moveToXXXX (вижте документацията).
За getString/Int/Long и т.н. просто трябва да кажете на курсора коя колона искате. Ако не знаете columnIndex, можете да използвате cursor.getColumnIndex("yourColumnName")
.
Вашият цикъл трябва да изглежда така:
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()]);
}